在C++ 程序中调用被 C编译器编译后的函数,需要在函数声明时(头文件中)加上 extern “C”,如:
文件c_test.h与c_test.c分别是函数fun_c的定义与实现文件:
c_test.h
#ifdef __cplusplus
extern "C" {
#endif
void fun_c();
#ifdef __cplusplus
};
#endif
#endif
c_test.c
void fun_c()
{
printf("this is a C function/n");
}
这样,当c_test.h和c_test.c文件被C编译器编译后,在其他C++程序中就能正常调用在c_test.h中声明的fun_c函数(当然需要c_test.h和c_test.o);
因为extern “C”的含义就是:
为了在C++代码中调用用C写成的库文件(或函数),就需要用extern "C"来告诉编译器:这是一个用C写成的库文件,请用C的方式来链接它们。
C++语言支持函数重载,C语言不支持函数重载。函数被C++编译后在库中的名字与C语言的不同。假设某个函数的原型为:void foo(int x, int y);该函数被C编译器编译后在库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字。
C++提供了C连接交换指定符号extern“C”来解决名字匹配问题。