extern "C"用于使C++编译器按C语言方式处理函数链接,避免因C++函数名修饰导致与C代码链接失败。

在C++程序中使用 extern "C" 的主要作用是告诉C++编译器:按照C语言的方式去处理函数或变量的链接(linkage),避免C++的函数名修饰(name mangling)机制对它们进行改名。这在C++与C语言混合编程时非常关键。
为什么需要 extern "C"?
C++支持函数重载,因此编译器在编译时会对函数名进行修饰(即 name mangling),将函数名、参数类型等信息编码进最终的符号名中。而C语言不支持重载,函数名不会被修饰,保持原样。
当你在C++代码中调用一个由C语言编写的函数时,如果不对该函数声明为 extern "C",C++编译器会按修饰后的名字去查找,但C编译器生成的目标文件中保存的是未修饰的名字,导致链接失败(undefined reference)。
如何使用 extern "C"?
单个函数声明:在C++中调用C函数时,可以这样声明:
立即学习“C语言免费学习笔记(深入)”;
extern "C" void my_c_function(int a);
通常在包含C语言头文件时,使用块形式:
extern "C" { #include "my_c_header.h"}
为了让同一个头文件能被C和C++同时使用,常见写法是:
#ifdef __cplusplusextern "C" {#endif
// C函数声明void func1(int);void func2(void);
#ifdef __cplusplus}#endif
这样,当C++编译器(定义了 __cplusplus)包含这个头文件时,会启用 extern "C";而C编译器则忽略这部分预处理指令,正常编译。
实际应用场景
在项目中混合使用C和C++代码时,比如:
- 用C编写底层库(如硬件驱动、算法模块),用C++实现上层逻辑
- 调用操作系统API或第三方C库(如 pthread、libpng、sqlite3)
- 构建可被C调用的C++接口(反向使用时也需注意封装)
正确使用 extern "C" 能确保链接顺利进行,避免符号找不到的问题。
基本上就这些。它不改变语法,也不影响功能实现,只是在编译和链接层面协调两种语言的差异。混合编程时记得处理好接口声明,就能平稳协作。











