您的位置:首页 > 其它

为什么在头文件中有extern "C" ? .

2014-02-09 20:46 274 查看
#ifdef __cplusplus

extern "C" {

#endif

上述的代码片段,经常出现在程序的一些头文件中。有什么用途呢?!今天我来唠叨唠叨。

首先我们要了解一下C/C++中关键字extern的作用---用于定义一个标示符的可见性范围(详细见我的另外一篇有关可见性的博文-----《什么是internal linkage 和external linkage??》 )。

extern使得程序的某些标识符能够被其他obj文件可见;“C ”表示接下来的函数都以C标准而不是C++标准来编译链接。

这个做的目的是什么呢?这样做的目的至少有两个个,就是能够在程序中使用C和C++混合编程。

可能有些C新手不太明白,为什么这样做的目的是为了实现C与C++得混合编程呢?

这就要涉及到C++编译器与C编译器的区别了;C++编译器为了支持函数的重载在编译函数时会对函数名称进行改编,例如:

void testExtern(int x, int y)可能会变编译成"?testExtern@@@YYAZCAJ@ZW@C"(每个编译器对名称改编有不同的规则)。

如果我们有C++写的是一个DLL,以后可能被其C客户程序所调用,这样就会出问题,因为用C编译编译出了的程序不会对名称进行改编(或者说可能只是简单的改变,总之不会与C++编译器相同),这样用C编写的客户程序调用

testExtern(int x,int y)函数时,链接器在连接时会找不到该函数(因为函数名已经被C++编译器改编了)。

因此如果你用C++写出的程序可能要被C客户程序调用时,就要使用extern "C"让你的C++编译器使用C编译器的标准来编译C++函数。

第二个原因,就是我们的C++程序要调用一些C原因写出的库函数,我们必须在C的头文件里写下如下字段:

(1)将如下的代码行添加到C头文件的最上方

#ifdef __cplusplus

extern "C" {

#endif

(2)将如下的代码行添加到C头文件的最末尾处

#ifdef __cplusplus

}

#endif

__cplusplus是一个C++预编译器的宏,只有C++编译器才有,如果是C++编译器则该宏产生作用,如果是C编译器则该宏已经宏所包括的语句行都不起作用;__cplusplus宏告诉编译器现在使用的是C++编译标准在编译程序,而extern "C"则告诉编译器,以下的函数都要以C标准进行调用,这样C++编译器就不会自动对要调用的函数进行名字改编了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: