编程C++ 开发人员

在 C++ 中如何实现外部函数机制 (extern 'C'),以及它的用途是什么?

用 Hintsage AI 助手通过面试

答案。

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

关键特点:

  • 禁用 name mangling,以确保与 C 的兼容性
  • 用于集成第三方库
  • 不允许在 'extern "C"' 范围内重载函数

误导性问题。

可以重载 extern "C" 中的函数吗?

不可以,重载是不可能的,因为使用了标准 C 函数名。

如果将模板函数声明为 extern "C" 会发生什么?

编译错误,因为模板是 C++ 的独特特性,在 C 中不受支持。

可以在单个类级别使用 extern "C" 吗?

不可以,只能用于函数和变量,而不是类或方法。

常见错误和反模式

  • 在不同文件之间的链接混淆
  • 尝试在 extern "C" 中重载函数
  • 在 extern "C" 内部使用 C 不支持的所有内容:类、模板、重载

生活中的示例

负面案例

C++ 项目在没有 extern "C" 的情况下链接第三方 C 库,然后由于符号名称不匹配代码无法链接。

优点:

  • 允许(如果正确实施)与第三方库一起工作

缺点:

  • 忘记 name mangling 时会出错;链接无法创建

正面案例

在集成第三方 C 库时,在头文件中使用 extern "C"。

优点:

  • 稳定的链接
  • 简化兼容性

缺点:

  • 无法重载函数