#ifdef __cplusplus 和 extern "C" 解释
#ifdef __cplusplus
和 extern "C"
是一种常见的预处理宏,用于确保在 C++ 代码中兼容 C 语言的函数或代码接口。让我们逐步解释:
1. #ifdef __cplusplus
__cplusplus
是一个在 C++ 编译器中定义的宏,用来表示当前代码是用 C++ 编译器编译的。如果使用 C++ 编译器来编译代码,这个宏会自动被定义。#ifdef
是条件编译指令,意思是“如果__cplusplus
已定义”,也就是说,这段代码仅在用 C++ 编译器编译时执行。
2. extern "C"
-
在 C++ 中,函数名支持 函数重载 和 名字修饰(name mangling),这使得函数名在编译后变得复杂。例如,C++ 的名字修饰机制会把函数名编码成带有参数类型信息的字符串。
-
extern "C"
是 C++ 中的一种语言连接规范,表示该函数或代码块应该按照 C 的方式进行编译和链接。C 语言没有名字修饰,因此extern "C"
告诉 C++ 编译器不要对函数名进行修饰,这样这些函数就可以被其他语言(如 C 或者其他不支持名字修饰的语言)调用。
3. 完整结构解释
#ifdef __cplusplus
extern "C" {
#endif
// 这里放的是 C 风格的函数声明或定义
// 它们可以在 C++ 和 C 环境中同时使用
#ifdef __cplusplus
}
#endif
-
当用 C++ 编译器编译时:
#ifdef __cplusplus
为真,进入extern "C"
块。extern "C"
作用在这段代码块上,告诉 C++ 编译器按 C 语言的方式处理这些函数,即不进行名字修饰,使得函数可以在 C 语言或者其他外部代码中被正确调用。
-
当用 C 编译器编译时:
__cplusplus
宏不会被定义,#ifdef __cplusplus
失败,直接忽略extern "C"
部分。- 因为 C 语言本身不支持名字修饰,这样函数在 C 中可以正常编译和调用。
使用场景
这种结构常用于编写跨 C 和 C++ 的库,确保库可以被 C 和 C++ 编译器正确调用。例如,一个用 C 编写的库可以通过 extern "C"
在 C++ 中被正确调用,而不会因为名字修饰问题导致链接错误。
示例:
#ifdef __cplusplus
extern "C" {
#endif
void my_c_function(); // 函数声明,C 和 C++ 均可以使用
#ifdef __cplusplus
}
#endif
这个示例确保 my_c_function
在 C++ 中不被名字修饰,可以被其他 C 代码调用,同时也能在 C++ 项目中正常使用。
总结
#ifdef __cplusplus
检查当前代码是否正在使用 C++ 编译器编译。extern "C"
告诉 C++ 编译器按照 C 的方式处理函数,避免名字修饰,使得函数能在 C 和 C++ 之间兼容。
本文来自博客园,作者:海_纳百川,转载请注明原文链接:https://www.cnblogs.com/chentiao/p/18475676,如有侵权联系删除