经常c c++混合编程的时候,需要用到extern "C"的关键字,这里说明一下其原理:
由于c++为了支持面向对象编程,命名空间和函数的重载,定义了更加复杂的符号命名规则,因为c++的函数一般都是属于某个类,或者某个命名空间,为了唯一的标识函数,链接器在为函数入口点建立符号的时候,必须用某种方法来包含函数的从属信息。c++的重载机制允许同一个类的不同函数拥有相同的函数名和返回值,只是参数不同,所以为了唯一的标识函数,链接器在为函数的入口点建立符号的时候,必须用某种方法来包含函数的参数信息。所以为了满足这些要求,编译器设计了名称修饰技术,名称修饰技术是将函数名,函数的从属信息,函数的参数列表进行组合,生成函数符号的过程,具体来说,就是函数的从属信息作为函数名的前缀,参数列表作为函数名的后缀。
所以编译c++的时候有些c函数不需要修饰,但链接器还是会默认进行修饰的,为了告诉链接器不要进行修饰,就出现了extern “c” 关键字。
#ifdef __cplusplus
extern "C"
{
#endif
int my_function(int x, int y);
#ifdef __cplusplus
}
#endif
其实通俗一点说,就是告诉编译器用extern "C"包起来的code要按照c语言的方法去寻找编译和链接。
参考:
https://blog.youkuaiyun.com/jiqiren007/article/details/5933599