面试题答案
一键面试extern "C" 的作用
- 指定函数的编译和链接约定:在C++中,函数的编译和链接遵循C++的命名修饰规则(name mangling),会在函数名中加入参数类型等信息,以实现函数重载。而
extern "C"
告诉编译器,其后声明的函数func
要按照C语言的编译和链接约定进行处理,C语言没有函数重载,其函数名不会进行复杂的命名修饰。这样做主要是为了能够与C语言代码进行混合编程,因为C语言编译器对函数名的处理方式与C++不同。
对函数调用和链接的影响
- 函数调用:从调用者角度,如果是C++代码调用该函数,调用方式与普通C++函数调用类似,但由于函数按照C语言约定编译,编译器在生成调用代码时,会按照C语言的调用规范,如参数传递顺序、栈的管理等进行处理。如果是C代码调用该函数,由于函数遵循C语言编译和链接约定,C代码可以直接调用,无需特殊处理,就像调用普通C函数一样。
- 链接:在链接阶段,链接器会按照C语言的命名规则去寻找函数的定义。对于
func
函数,链接器不会在目标文件中寻找经过C++命名修饰的函数名,而是按照C语言的简单函数名(未修饰的)去匹配。这使得C++代码能够正确链接到用C语言编写的函数实现,或者让C代码能够链接到使用extern "C"
声明的C++函数实现,解决了不同语言之间函数链接的兼容性问题。