extern "C"用于关闭C++函数名修饰,使C++能正确调用C函数或被C调用。由于C++编译器会重命名函数名以支持重载,而C不会,直接链接会导致名称不匹配。使用extern "C"可确保函数按C语言的命名规则进行链接。单个函数可用extern "C"声明,多个函数可用代码块包围。在兼容C和C++的头文件中,常通过#ifdef __cplusplus判断是否启用extern "C"包裹。注意extern "C"不能用于类成员函数,也不支持函数重载,但可用于全局变量的跨语言访问。这是实现C/C++混合编程的关键机制。

在C++中,extern "C" 的主要作用是告诉编译器:按照C语言的方式去处理函数或变量的链接(linkage),即关闭C++的函数名修饰(name mangling)机制。这在C++代码中调用C语言编写的函数,或者让C语言代码调用C++函数时非常关键。
C++支持函数重载、类、命名空间等特性,因此编译器会对函数名进行修饰(也叫名字改编,name mangling),生成一个唯一标识符用于链接。而C语言不支持这些特性,函数名在编译后保持相对原始的形式。
例如,以下C++函数:
void func(int a);可能被编译为类似 _Z4funci 这样的符号名。而同样的C函数:
立即学习“C++免费学习笔记(深入)”;
void func(int a);在目标文件中仍保留为 func。如果C++直接调用C编译生成的函数,由于名称不匹配,链接器会报“undefined reference”错误。
使用 extern "C" 可以让C++以C的命名规则来声明和链接函数。
单个函数的声明方式:
extern "C" void my_c_function(int a);多个函数可以放在一个代码块中:
extern "C" {这样,这些函数在链接时就不会经过C++的名字修饰,能正确找到由C编译的目标符号。
当你写一个既可能被C++包含,也可能被C包含的头文件(比如某个C库的头文件)时,常用如下结构:
#ifdef __cplusplus这里通过预定义宏 __cplusplus 判断当前是否在C++编译环境中。如果是,就用 extern "C" 包裹函数声明,否则C编译器忽略这部分条件编译内容。
这种写法保证了同一份头文件可以在C和C++项目中安全使用。
extern "C" 有一些使用上的限制:
例如:
extern "C" int global_config;表示这个变量在C目标文件中定义,C++中可引用。
基本上就这些。extern "C" 是实现C/C++混合编程的关键机制,理解它有助于你更好地集成C库到C++项目中,或者编写跨语言接口。核心就是:关闭C++名字修饰,按C方式链接。
以上就是c++++中extern "C"的作用是什么_c++ extern "C"用法解析的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号