MST

星途 面试题库

面试题:C++中使用extern "C"调用C编译器编译函数的基础理解

请解释在C++代码中,当调用C编译器编译的函数时,为什么要使用extern "C" ?如果不使用,可能会出现什么问题?
42.1万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

为什么要使用 extern "C"

  1. 函数命名规则差异:C++ 采用函数名修饰(name mangling)技术,会根据函数的参数类型、个数等信息对函数名进行修改,以实现函数重载。而 C 语言没有函数重载,其函数命名规则较为简单,直接使用函数名。当在 C++ 代码中调用 C 编译器编译的函数时,使用 extern "C" 可以告知 C++ 编译器按照 C 语言的命名规则来寻找函数,避免因命名规则差异导致找不到函数的情况。
  2. 链接兼容性:C++ 程序在链接时需要按照 C++ 的方式查找符号,而 C 函数的符号遵循 C 的规则。extern "C" 确保了 C++ 代码在链接时能够正确找到 C 函数的实现,保证链接兼容性。

不使用 extern "C" 可能出现的问题

  1. 链接错误:由于 C++ 编译器对函数名进行修饰,而 C 函数没有这种修饰,链接器在链接 C++ 代码与 C 函数时,会按照 C++ 修饰后的函数名去寻找 C 函数的实现,但是 C 函数实际的符号名是未修饰的,这就导致链接器找不到对应的函数实现,从而报链接错误,例如 undefined reference to 'function_name'
  2. 运行时错误:即使侥幸通过链接(如在某些特定情况下,函数名修饰恰好没有冲突),在运行时也可能出现错误。因为函数调用约定(如参数传递方式、栈的清理方式等)在 C 和 C++ 中可能存在差异,不使用 extern "C" 可能导致参数传递错误或栈不平衡,进而引发程序崩溃或出现未定义行为。