请教#ifdef _cplusplus extern "C" { #endif是什么意思
请问#ifdef __cplusplus extern "C" { #endif是什么意思
#ifdef __cplusplus
extern "C" {
#endif
------解决方案--------------------
#ifdef __cplusplus //如果是c++程序,肯定会有__cplusplus
extern "C" { //下面程序采用c方式编译,因为c中没有重载,c++中有。编译时转换规则不一样
#endif
------解决方案--------------------
其实很简单,作用就是
如果此头文件是在c++中使用的(就是一个.cpp文件include此头文件,而不是一个.c文件),
那么函数名称粉碎方式仍然使用C中的方式。(就是此函数编译后在object文件中的内部名称和C中是兼容的)
比如
void foo1();
如果c文件包含了它,生成的object文件中此函数被命名为 c_foo1,
而在cpp文件中包含了它,生成的object中此函数命名为cpp_foo1,使用extern "C"后,可以强制使其仍然为"c_foo1"。
这么做的目的是为了在c和cpp中互相调用函数命名一致,否则会出现链接错误。
#ifdef __cplusplus
extern "C" {
#endif
------解决方案--------------------
#ifdef __cplusplus //如果是c++程序,肯定会有__cplusplus
extern "C" { //下面程序采用c方式编译,因为c中没有重载,c++中有。编译时转换规则不一样
#endif
------解决方案--------------------
其实很简单,作用就是
如果此头文件是在c++中使用的(就是一个.cpp文件include此头文件,而不是一个.c文件),
那么函数名称粉碎方式仍然使用C中的方式。(就是此函数编译后在object文件中的内部名称和C中是兼容的)
比如
void foo1();
如果c文件包含了它,生成的object文件中此函数被命名为 c_foo1,
而在cpp文件中包含了它,生成的object中此函数命名为cpp_foo1,使用extern "C"后,可以强制使其仍然为"c_foo1"。
这么做的目的是为了在c和cpp中互相调用函数命名一致,否则会出现链接错误。