"extern C"通常用于C++程序与C程序交互的情况,主要有以下两个场景:
- C++程序调用C语言的函数库
C++程序如果要使用C语言的函数库,需要将函数库中的函数声明为C语言风格,即使用extern "C"关键字修饰,以达到链接标准C语言函数库的目的。例如:
extern "C" {
int printf(const char *format, ...);
}
- C语言程序调用C++程序的函数
当C语言调用C++程序中的函数时,需要将C++函数声明为C语言风格的函数,以便C语言能够调用,通常使用 extern "C" 修饰C++函数声明。举例如下:
C++ 程序:
#ifdef __cplusplus
extern "C" { //告诉编译器按照 C 风格编译,避免 C++ 函数名被重命名
#endif
int Sum(int a, int b);
#ifdef __cplusplus
}
#endif
C语言程序:
// 假设 Sum 函数在 cpp_lib.dll 库中
void* handle = dlopen("cpp_lib.dll", RTLD_LAZY);
int (*Sum)(int, int) = (int(*)(int, int)) dlsym(handle, "Sum");
if(Sum == NULL){
printf("unable to load Sum from cpp_lib.dll.\n");
return 1;
}
int res = Sum(1,2);
printf("res=%d\n", res);
dlclose(handle);
注:这里的 dlopen,dlsym, dlclose 等函数是 Linux 下的动态链接库调用函数。类 Windows 下有相应的函数。