面试题答案
一键面试extern "C"
的作用
在C++中,extern "C"
主要用于解决C和C++之间函数名修饰规则不同的问题。C++为了实现函数重载,会对函数名进行复杂的修饰(mangling),而C语言的函数名修饰规则相对简单。当需要在C++代码中调用C语言函数,或者在C语言代码中调用C++函数时,使用extern "C"
可以确保函数名按照C语言的规则进行链接,避免链接错误。
实现C与C++代码函数互调的示例
1. C++调用C函数
C函数代码(c_function.c
)
#include <stdio.h>
// C语言函数
void c_function() {
printf("This is a C function.\n");
}
C++调用代码(cpp_call_c.cpp
)
extern "C" {
// 声明要调用的C函数
void c_function();
}
int main() {
c_function();
return 0;
}
2. C调用C++函数
C++函数代码(cpp_function.cpp
)
#include <iostream>
extern "C" {
// 要被C调用的C++函数
void cpp_function() {
std::cout << "This is a C++ function called from C.\n";
}
}
C调用代码(c_call_cpp.c
)
// 声明要调用的C++函数
extern void cpp_function();
int main() {
cpp_function();
return 0;
}
在编译时,对于C++调用C函数的情况,需要先编译c_function.c
生成目标文件(如c_function.o
),再编译cpp_call_c.cpp
并链接c_function.o
。对于C调用C++函数的情况,先编译cpp_function.cpp
生成目标文件(如cpp_function.o
),再编译c_call_cpp.c
并链接cpp_function.o
。具体的编译命令因编译器而异,例如使用GCC编译:
- 编译
c_function.c
:gcc -c c_function.c
- 编译
cpp_call_c.cpp
并链接c_function.o
:g++ cpp_call_c.cpp c_function.o -o cpp_call_c
- 编译
cpp_function.cpp
:g++ -c cpp_function.cpp
- 编译
c_call_cpp.c
并链接cpp_function.o
:gcc c_call_cpp.c cpp_function.o -o c_call_cpp