面试题答案
一键面试extern "C"
对C++链接规范的影响
在C++中,编译器会对函数名进行重整(name mangling),以支持函数重载等特性。这意味着不同参数列表的同名函数在目标文件中会有不同的符号名。而C语言没有函数重载,其函数名在目标文件中的符号名就是函数定义时的名字。
extern "C"
的作用是告诉C++编译器,按照C语言的链接规范来处理其后声明或定义的函数,即不进行函数名重整,使得这些函数在链接时可以被C语言代码识别。
在多源文件项目中的正确使用
- C++调用C函数:
- 在C++头文件中:
extern "C" { // 声明C函数 void cFunction(int arg); }
- 在C源文件中:
#include <stdio.h> void cFunction(int arg) { printf("C function called with arg: %d\n", arg); }
- 在C++头文件中:
- C调用C++函数:
- 在C++源文件中:
extern "C" void cppFunction() { // C++函数实现 // 可以在这里使用C++特性 }
- 在C头文件中:
// 声明C++函数(已被extern "C"修饰,符合C语言链接规范) void cppFunction();
- 在C源文件中:
#include <stdio.h> void callCppFunction() { cppFunction(); printf("Called C++ function\n"); }
- 在C++源文件中:
- 对于多源文件项目:
- 如果有多个C++源文件都要调用C函数,应将
extern "C"
声明放在头文件中,供各C++源文件包含。 - 对于C语言源文件,确保在调用C++函数前,相关的C++函数已被正确声明(通过包含合适的头文件,且头文件中对C++函数使用了
extern "C"
声明)。同时,在构建项目时,要正确设置编译和链接选项,确保C和C++源文件都能正确编译并链接在一起。
- 如果有多个C++源文件都要调用C函数,应将