extern "c"{}

来源:互联网 发布:大麦盒子怎么安装软件 编辑:程序博客网 时间:2024/06/05 02:27

在C++中,有一个extern “c”{} 的用法,主要为了与C兼容。


C++中,编译器为处理同名函数的符号链接问题,一般会自己定义一套符号命名规则,如:

void func(int);

可能在编译后被命名成这样:

_void_func_int

当然,上面只是我自己弄的……,实际的编译器有自己的规则,但是在C语言的链接库中,符号名是已经确定了的,如:

void * memset(void *, int, size_t);

其符号名就是memset,如果使用C++编译器,经实际的符号处理后(每个编译器都不一样,这里是假设有这么一个编译器),可能变成:

_void_memset_void_int_size_t

这样在链接的时候,就无法在C语言的库中找到相应的函数入口地址。
于是extern “c”{} 出来了,它告诉C++编译器,此 {} 中的符号不要经过编译器的符号处理,所以在C语言的头文件中,为了在C++能继续使用这些函数,需要对相应声明函数作如下处理:

extern "c" {    void * memset(void *, int, size_t);}

但是还有一个问题,就是C语言不支持extern “c”{} 语法,于是又为了兼顾C与C++,采用了预处理的方法,在C语言中,则不加extern “c” {} ,在C++中,则加上extern “c”{} :

#ifdef __cplusplus//若在C++中extern "c"{#endif    void * memset(void *, int, size_t);#ifdef __cplusplus}#endif

先将目前的认识记下来吧。