extern "C" 机制提供了与 C 语言代码交互的能力。这使得可以使用 C 库,并简化了 C++ 与其他语言之间的连接。
问题背景: 从一开始,C++ 语言是建立在 C 语言基础上的,但具有自己的特点,包括 'name mangling',以支持函数重载和其他特性。
问题: C++ 中的函数名被编译为具有附加结构(mangled)的符号,但在 C 中没有这种转换。因此,无法仅仅将 C 代码的头文件链接到 C++ 编译器,而不需要额外的努力。
解决方案:
将函数包装在 extern "C" 结构中,禁止 'name mangling',使它们对使用 C 编译器编译的代码可见。
代码示例:
#ifdef __cplusplus extern "C" { #endif void foo(int); #ifdef __cplusplus } #endif
关键特点:
可以重载 extern "C" 中的函数吗?
不可以,重载是不可能的,因为使用了标准 C 函数名。
如果将模板函数声明为 extern "C" 会发生什么?
编译错误,因为模板是 C++ 的独特特性,在 C 中不受支持。
可以在单个类级别使用 extern "C" 吗?
不可以,只能用于函数和变量,而不是类或方法。
C++ 项目在没有 extern "C" 的情况下链接第三方 C 库,然后由于符号名称不匹配代码无法链接。
优点:
缺点:
在集成第三方 C 库时,在头文件中使用 extern "C"。
优点:
缺点: