经常在C语言的头文件中看到下面的代码:
#ifdef__cplusplusextern"C"{#endif//allofyourlegacyCcodehere#ifdef__cplusplus}#endif
这通常用于C++和C混合编程的时候,为了防止C++的编译器在编译C文件的时候出现错误;众所周知,C++可以进行函数名重载,但是C则没有这种功能,那这和extern"C"又有什么关系呢?先看下面这个表格,如下所示;
语言描述C函数名可以作为唯一ID和代码段的程序建立联系C++因为重载的关系,函数名符号会被破坏,从而会根据函数的参数不同而重新生成函数符号未添加extern"C"test.h
#ifndefTEST_H#defineTEST_Hvoidfoo1(void);voidfoo2(void);voidfoo3(inti);#endif
test.c
voidfoo1(void){}voidfoo2(void){}voidfoo3(inti){}intmain(intargc,char**argv){foo1();foo2();foo3(1);return0;}
编译这两个文件,生成test.o文件,通过objdump查看函数符号;
g++-ctest.ctest.hobjdump-ttest.o
可以看到函数符号已经被编译器修改了;
添加extern"C"test.h
#ifndefTEST_H#defineTEST_H#ifdef__cplusplusextern"C"{#endifvoidfoo1(void);voidfoo2(void);voidfoo3(inti);#ifdef__cplusplus}#endif#endif
test.c
#ifdef__cplusplusextern"C"{#endifvoidfoo1(void){}voidfoo2(void){}voidfoo3(inti){}#ifdef__cplusplus}#endifintmain(intargc,char**argv){foo1();foo2();foo3(1);return0;}
编译这两个文件,生成test.o文件,通过objdump查看函数符号;
g++-ctest.ctest.hobjdump-ttest.o
这时候函数符号是正确的;
extern"C"是告诉C++的编译器不要打我这些C函数的主意。
-END-
来源:小麦大叔
推荐阅读
国内为什么写不出操作系统和编程语言?史上最全Linux/C/C++思维导图,理清思路全靠它了!如何在Linux上恢复误删除的文件或目录超实用!分享5个基本Linux命令行工具的现代化替代品从零基础到Linux开发,我是这样一步步过来的免责声明:整理文章为传播相关技术,版权归原作者所有,如有侵权,请联系删除预览时标签不可点收录于话题#个上一篇下一篇