当前位置: 首页 > 科技观察

C语言中Extern“C”的作用你真的了解吗?

时间:2023-03-12 16:42:12 科技观察

大家好,我是小麦,今天是周末,但是学习还是停不下来。我经常在C语言的头文件中看到如下代码:#ifdef__cplusplusextern"C"{#endif//allofyourlegacyCcodehere#ifdef__cplusplus}#endif这通常在C++和C混合编程时使用,为了防止C++编译器编译C文件时出错;众所周知,C++可以重载函数名,而C却没有这个功能,那么这和extern"C"有什么关系呢?先看下表,如下图;Language描述C函数名可以作为唯一的ID,与代码段的程序建立联系。C++因为重载,函数名符号会被破坏,所以函数符号会根据函数的参数重新生成。没有添加Extern"C"test.h#ifndefTEST_H#defineTEST_Hvoidfoo1(void);voidfoo2(void);voidfoo3(inti);#endiftest.cvoidfoo1(void){}voidfoo2(void){}voidfoo3(inti){}intmain(intargc,char**argv){foo1();foo2();foo3(1);return0;}编译这两个文件,生成test.o文件,通过objdump查看函数符号;g++-ctest.ctest.hobjdump-ttest.o可以看到函数符号已经被编译器修改了;添加外部“C”test.h#ifndefTEST_H#defineTEST_H#ifdef__cplusplusextern“C”{#endifvoidfoo1(void);voidfoo2(void);voidfoo3(inti);#ifdef__cplusplus}#endif#endiftest.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函数的思路不错。这次的分享比较简单实用。下次见。本文转载自微信公众号“小麦大叔”,可通过以下二维码关注。转载本文请联系小麦大叔公众号。