天天看点

关于extern "C"

如果要混合链接C和C++的代码,就需要用到extern "C"。

1 C++要到C的函数

如果在.c文件里面定义了一个函数void func(int para),在.cpp文件中要用到该函数,那必须在C++代码(可以放cpp文件中或头文件中)中声明该函数,这样编译的时候才能通过,否则编译器会提示找不到该函数的定义。

声明的方法必须是:

extern "C"
void func(int para);
           

extern "C"在这里的作用是,告诉C++ compiler,在链接cpp文件的时候,如果遇到func调用,不必对func进行函数名的mangle。因为该函数func是用C语言写的,所以在obj文件中,func函数的名字就是叫做func。而C++不一样,由于要支持函数重载,C++ compiler一般会对函数名进行重命名,具体规则依不同编译器的不同而有差异。如果C++调用C++自己的函数,定义的函数名和调用函数名都进行了重命名,所以没有问题。但C compiler不会做此重命名,如果C++代码调用了C语言写的函数,如果不做extern "C"声明,C++ linker会从obj文件中找重命名过的函数名,这时候就会找不到。extern "C"告诉C++ linker,链接此函数时,不用进行函数重命名,直接用原来的名字搜索obj文件,这样就能找到。

2 C++写的函数要提供给C

比如C++要写个lib给C调用。同样,在C++代码中要用extern "C"来声明要给C调用的函数。

.h或.cpp文件中

extern "C"
void func(int para);
           

.cpp文件中

void func(int para)
{
.... //具体的实现
}
           

这样,当C++ compiler编译该文件时,就不会对该文件进行重命名,obj文件中仍然是它原来的函数名。这样C代码就可以直接用原来的函数名调用该函数。

不管是上面的哪种情况,extern "C"都是在cpp代码中出现,不应该在C代码中出现,C没有这个指令。因此,在所有出现extern “C”的地方,应该用一个宏包含进去

#ifdef _cplusplus

extern "C"

#endif

继续阅读