面试题答案
一键面试为什么要使用 extern "C"
- 函数命名规则差异:C++ 采用函数名修饰(name mangling)技术,会根据函数的参数类型、个数等信息对函数名进行修改,以实现函数重载。而 C 语言没有函数重载,其函数命名规则较为简单,直接使用函数名。当在 C++ 代码中调用 C 编译器编译的函数时,使用
extern "C"
可以告知 C++ 编译器按照 C 语言的命名规则来寻找函数,避免因命名规则差异导致找不到函数的情况。 - 链接兼容性:C++ 程序在链接时需要按照 C++ 的方式查找符号,而 C 函数的符号遵循 C 的规则。
extern "C"
确保了 C++ 代码在链接时能够正确找到 C 函数的实现,保证链接兼容性。
不使用 extern "C"
可能出现的问题
- 链接错误:由于 C++ 编译器对函数名进行修饰,而 C 函数没有这种修饰,链接器在链接 C++ 代码与 C 函数时,会按照 C++ 修饰后的函数名去寻找 C 函数的实现,但是 C 函数实际的符号名是未修饰的,这就导致链接器找不到对应的函数实现,从而报链接错误,例如
undefined reference to 'function_name'
。 - 运行时错误:即使侥幸通过链接(如在某些特定情况下,函数名修饰恰好没有冲突),在运行时也可能出现错误。因为函数调用约定(如参数传递方式、栈的清理方式等)在 C 和 C++ 中可能存在差异,不使用
extern "C"
可能导致参数传递错误或栈不平衡,进而引发程序崩溃或出现未定义行为。