为什么C++链接器不抱怨缺少这些函数的定义?



>我写了这段代码:

// 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只包含 C 版本的print()的定义。

  • 当我使用G++编译和构建程序时,我print.o与源文件一起传递给它main.cxx。它产生可执行文件并且工作正常,但在main.cxx内部我调用了print的C++版本(print(double)print(std::string)),这些版本没有在prnint.o中定义,因为它是使用 GCC 编译的,并且由于宏__cplusplus(条件编译)。那么为什么链接器不抱怨缺少这些函数的定义呢?谢谢!

我使用没有定义C++版本的gcc编译print.cxx...

差一点。gccg++都调用相同的编译器套件。该套件具有一组文件扩展名,它会自动识别为 C 或 C++。*.cxx文件全部编译为 C++,这是该扩展的默认行为。

您可以使用-x选项覆盖默认行为。

相关内容

  • 没有找到相关文章

最新更新