我目前工作要把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);
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 结尾