extern “C”用于解决C++与C函数符号不兼容问题,通过禁用C++名称修饰使C++能正确链接C函数。1. 因C++支持重载而进行名称修饰,C无此机制,导致链接时找不到对应符号;2. 使用extern “C”可声明单个或多个函数按C方式链接;3. 在头文件中结合#ifdef __cplusplus可实现C/C++通用;4. 常见于调用C库、共用头文件及C库回调函数场景;5. 注意其仅适用于全局函数变量,不可重载,不影响调用约定。

在C++程序中,extern “C” 是一个非常重要的语法特性,主要用于解决C++与C语言之间函数符号命名不兼容的问题。它的核心作用是指示编译器按照C语言的方式进行函数的链接(linkage),避免C++的名称修饰(name mangling)机制对函数名进行改写。
一、为什么需要 extern “C”?
C++支持函数重载,为了区分同名但参数不同的函数,编译器会对函数名进行“名称修饰”(也叫名字改编,name mangling),例如:
void func(int) → 可能被编译为 _Z4funci
void func(double) → 可能被编译为 _Z4funcd
而C语言不支持重载,编译器不会修饰函数名,func 就是 func。当你在C++代码中调用一个由C语言编写的函数时,如果直接引用,C++编译器会去找修饰后的名字,而C目标文件中只有未修饰的名字,导致链接错误(undefined reference)。
此时就需要 extern “C” 来告诉C++编译器:“这个函数是按C方式编译的,请用C的链接规则查找它”。
立即学习“C++免费学习笔记(深入)”;
二、extern “C” 的基本用法
1. 单个函数声明:
extern “C” void my_c_function(int a);
2. 多个函数打包声明:
extern “C” {
void func1();
int func2(double x);
char* get_string();
}
这种方式常用于包含C语言头文件时,防止C++编译器对其中函数进行名称修饰。
3. 在头文件中使用(常见于C库供C++调用):
#ifdef __cplusplus
extern “C” {
#endif
// C 函数声明
void c_func_a();
int c_func_b(int x);
#ifdef __cplusplus
}
#endif
这段代码的作用是:当被C++编译器处理时,加入 extern “C” 块;当被C编译器处理时,这些宏定义为空,不影响C的正常编译。
三、实际应用场景
1. 调用C语言编写的库
比如你有一个用C写的数学库 mathlib.c,其中定义了:
double add(double a, double b);
在C++代码中要调用它,必须这样声明:
extern “C” double add(double a, double b);
否则链接阶段会报错找不到 _Z3adddd 这样的符号。
2. 编写可被C和C++共同使用的头文件
很多系统级库(如pthread、socket、OpenSSL)都采用上面提到的 #ifdef __cplusplus 写法,确保头文件既能在C项目中使用,也能在C++项目中正确链接。
3. 回调函数传递给C库
某些C库(如libcurl、GTK)允许传入函数指针作为回调。如果你在C++中定义了一个普通函数并传过去,没问题;但如果该函数没有用 extern “C” 修饰,而C库尝试调用它,可能会因调用约定或链接问题出错。因此,最好将回调函数放在 extern “C” 块中声明。
四、注意事项
• extern “C” 只能用于全局函数和变量,不能用于类成员函数,因为C不支持类。
• 不能重载被 extern “C” 修饰的函数,因为C不支持重载,链接时无法区分。
• extern “C” 不影响C++的调用约定(calling convention),只是控制名称修饰和链接方式。
• 在 .cpp 文件中使用 extern “C” 包含标准C头文件时要小心,应确保只包围函数声明,而非整个头文件内容。
基本上就这些。extern “C” 看似简单,但在混合编程中极为关键,理解它有助于避免链接错误,提升跨语言开发效率。
以上就是c++++中extern “C”的作用_c++ extern “C”作用与用法详解的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1477262.html
微信扫一扫
支付宝扫一扫