为什么 C++ 链接器不抱怨缺少这些函数的定义?
Why the C++ linker doesn't complain about missing definitions of theses functions?
我写过这段代码:
// print.h
#pragma once
#ifdef __cplusplus
#include <string>
void print(double);
void print(std::string const&);
extern "C"
#endif
void print();
和源文件:
// print.cxx
#include "print.h"
#include <iostream>
void print(double x){
std::cout << x << '\n';
}
void print(std::string const& str){
std::cout << str << '\n';
}
void print(){
printf("Hi there from C function!");
}
和驱动程序:
// main.cxx
#include "print.h"
#include <iostream>
int main(){
print(5);
print("Hi there!");
print();
std::cout << '\n';
}
当我编译时:
gcc -c print.cxx && g++ print.o main.cxx -o prog
- 该程序运行良好,但对我来说最重要的是:
我使用 gcc
编译了 print.cxx
,它没有定义 C++ 版本 print(double)
和 print(std::string)
。所以我得到 print.o
只包含 print()
.
的 C 版本的定义
- 当我使用
G++
编译和构建程序时,我将 print.o
与源文件 main.cxx
一起传递给它。它生成可执行文件并且工作正常但在 main.cxx
中我调用了 print
的 C++ 版本(print(double)
和 print(std::string)
)并且这些未在 prnint.o
中定义因为它是使用 GCC 编译的,并且因为宏 __cplusplus
(条件编译)。那么链接器为什么不抱怨缺少这些函数的定义呢?谢谢!
I compiled print.cxx
using gcc
which doesn't define the C++ version...
不完全是。 gcc
和 g++
都调用相同的编译器套件。套件 has a set of file extensions 它 自动识别 为 C 或 C++。您的 *.cxx
文件全部编译为 C++,这是该扩展的默认行为。
您可以使用 -x
选项来覆盖默认行为。
我写过这段代码:
// print.h
#pragma once
#ifdef __cplusplus
#include <string>
void print(double);
void print(std::string const&);
extern "C"
#endif
void print();
和源文件:
// print.cxx
#include "print.h"
#include <iostream>
void print(double x){
std::cout << x << '\n';
}
void print(std::string const& str){
std::cout << str << '\n';
}
void print(){
printf("Hi there from C function!");
}
和驱动程序:
// main.cxx
#include "print.h"
#include <iostream>
int main(){
print(5);
print("Hi there!");
print();
std::cout << '\n';
}
当我编译时:
gcc -c print.cxx && g++ print.o main.cxx -o prog
- 该程序运行良好,但对我来说最重要的是:
我使用 gcc
编译了 print.cxx
,它没有定义 C++ 版本 print(double)
和 print(std::string)
。所以我得到 print.o
只包含 print()
.
- 当我使用
G++
编译和构建程序时,我将print.o
与源文件main.cxx
一起传递给它。它生成可执行文件并且工作正常但在main.cxx
中我调用了print
的 C++ 版本(print(double)
和print(std::string)
)并且这些未在prnint.o
中定义因为它是使用 GCC 编译的,并且因为宏__cplusplus
(条件编译)。那么链接器为什么不抱怨缺少这些函数的定义呢?谢谢!
I compiled
print.cxx
usinggcc
which doesn't define the C++ version...
不完全是。 gcc
和 g++
都调用相同的编译器套件。套件 has a set of file extensions 它 自动识别 为 C 或 C++。您的 *.cxx
文件全部编译为 C++,这是该扩展的默认行为。
您可以使用 -x
选项来覆盖默认行为。