#ifdef __cplusplus

我目前工作要把C++代码转换成C,转的过程中会有C和C++混用的问题,这时需要下面的 #ifdef __cplusplus, 因为一些函数编译后找不到,是因为按照C编译和C++编译后的函数或变量的符号修饰不一样,程序报错找不到 symbol


#ifdef __cplusplus
extern "C"{
#endif
...
#ifdef __cplusplus
}
#endif


调用extern "C” 会让c++编译器按照C的编译格式,看一下头文件



为了避免符号名冲突,C源文件 foo.c 经过编译后,bi全局变量和函数名后面加"_"   

c的源文件编译后是 ”foo_“

fortran的源文件编译后的符号名是“_foo_"


C++中,函数重载,Function Signature 函数签名 

int foo(int);
void foo(float);

在编译compile和链接link处理符号时,一个函数签名对应一个 修饰名称 decorated name, 这就是编译后目标文件从符号名

                           GCC 的c++修饰规则:        Visual C++编译的修饰规则:

int foo(int)      _Z3f00i                 ?foo@@YAHH@Z
float foo(float)  _Z3foof                 ?fooAAYAMM@Z
int C::foo(int)   _ZN1C3fooEi             ?foo@C@@AAEHH@Z

以?开头 

 + 函数名   @结尾函数名    

 + 命名空间或类名C  @结尾函数名称空间  

 + A 表示函数调用类型为 ”__cdecl“  

 + 参数类型 返回值

 以 Z 结尾




你可能感兴趣的:(#ifdef __cplusplus)