在C语言头文件中经常看到以下代码:#ifdef& nbsp; __ cplusplusextern& nbsp;“ C”& nbsp; {#endif //& nbsp; all& nbsp; of& nbsp; your& nbsp; legacy  C& nbsp; code& nbsp;#ifdef& nbsp; __ cplusplus}#endif通常在C ++和C混合编程时使用,以防止C ++编译器在编译C文件时出错。众所周知,C ++可以执行函数名重载,但是C不具有该函数,则此和外部“ C”的作用是什么。事情?首先看下表,如下图;语言描述C函数名称可以用作与代码段C ++的程序建立连接的唯一ID。由于存在重载关系,因此将破坏函数名称符号,并根据函数参数对其进行重新生成。未添加功能符号,否则用“ C”表示。 test.h#ifndef& nbsp; TEST_H#define& nbsp; TEST_Hvoid& nbsp; foo1(void); void& nbsp; foo2(void); void& nbsp; foo3(int& nbsp; i);#endif test.c void& nbsp; foo1(void){} void& nbsp; foo2(void)& nbsp; {} void& nbsp; foo3(int& nbsp; i){} int& nbsp; main(int& nbsp; argc, char **& nbsp; argv){& nbsp;& nbsp; foo1();& nbsp; foo2();& nbsp; foo3(1);& nbsp;& nbsp; return& nbsp; 0;}编译这两个文件,生成test.o文件,并通过objdump查看函数符号; g ++  -c& nbsp; test.c  test.hobjdump& -t& nbsp; test.o您可以看到功能符号已被编译器修改;添加extern“ C” test.h#ifndef& nbsp; TEST_H#define& nbsp; TEST_H#ifdef& nbsp; __ cplusplusextern& nbsp;“ C”& nbsp; {#endifvoid& nbsp; foo1(void); void& nbsp; ); void& nbsp; foo3(int& nbsp; i);#ifdef& nbsp; __ cplusplus}#endif#endif test.c#ifdef& nbsp; __ cplusplusextern& nbsp;“ C”& nbsp; {#endifvoid& nbsp; foo1(void){} void& nbsp; foo2(void)& nbsp; {} void& nbsp; foo3(int& nbsp; i){}#ifdef& nbsp; __ cplusplus}#endifint& nbsp; main( int& nargs,char **& nbsp; argv){& nbsp;& nbsp; foo1();& nbsp; foo2();& nbsp; foo3(1);& nbsp;& ; nbsp; return& nbsp; 0;}编译这两个文件,生成test.o文件,通过objdump查看函数符号; g ++& -c& nbsp; test.c& nbsp; test .hobjdump& nbsp; -t& nbsp; test.o此时,功能符号是正确的;外部“ C”告诉C ++编译器不要使用这些C函数。现成的车轮OSAL操作系统抽象层的移植简单的PID算法的快速识字教您快速瘦身微控制器固件的一个技巧教您了解C语言的Q格式的基本知识|十六进制文件格式的详细说明-结束-