extern "C"
在 C++ 中是一个非常重要的特性,用于解决 C++ 与 C 代码之间的兼容性问题。它主要用于以下几个方面:
1. 名称修饰(Name Mangling)的避免
- • 背景说明:C++ 支持函数重载,因此编译器会对同名函数进行名称修饰(或称名称变形),以区分不同的函数。但是,C 语言不支持函数重载,因此没有这种名称修饰机制。
- • 使用
extern "C"
的目的:确保 C++ 代码中的特定部分(通常是函数)在编译后的二进制文件中保持 C 语言的链接规范,从而可以被 C 代码或其他语言(按照 C 语言的链接规范)调用。 - • 示例代码:
// C++ 函数声明
extern "C" void myFunction();
// C++ 函数定义
extern "C" void myFunction() {
// 函数实现
}
2. 与 C 语言库的链接
- • 背景说明:当 C++ 代码需要调用 C 语言编写的库时(如标准库函数),使用
extern "C"
确保正确链接到这些库。 - • 使用
extern "C"
的目的:防止 C++ 编译器对外部 C 语言库函数的名称进行修饰,确保能够成功链接。 - • 示例代码:
extern "C" {
#include <math.h>
}
int main() {
double result = sqrt(4.0); // 调用 C 语言的 sqrt 函数
return 0;
}
3. 在 C++ 中定义供 C 代码调用的函数
- • 背景说明:在混合编程时,可能需要在 C++ 中定义一些函数,让 C 代码调用。
- • 使用
extern "C"
的目的:保证 C++ 中定义的函数,能够被 C 代码按照 C 的链接规范调用。 - • 示例代码:
extern "C" void calledFromC() {
// 函数实现
}
4. 在头文件中使用 extern "C"
- • 背景说明:为了使头文件同时适用于 C 和 C++,可以在头文件中使用
extern "C"
。 - • 使用
extern "C"
的目的:确保头文件中的声明在 C++ 中按照 C 的链接规范处理,而在 C 中正常处理。 - • 示例代码:
#ifdef __cplusplus
extern "C" {
#endif
void functionFromHeader();
#ifdef __cplusplus
}
#endif
5. 注意事项
- •
extern "C"
不能应用于类成员函数,因为 C 语言不支持类。 - • 使用
extern "C"
时,需要确保函数实现符合 C 语言的编程规范,避免使用 C++ 特有的特性,如引用、类、异常等。
通过这些条目的介绍和示例,可以看出 extern "C"
是 C++ 用来处理与 C 代码交互的重要工具,特别是在需要确保函数名称不被 C++ 编译器修饰的场合非常有用。