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

来源:互联网 发布:淘宝国产手办店铺 编辑:程序博客网 时间:2024/05/02 04:42

#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++编译器就不会自动对要调用的函数进行名字改编了。

 

参考资料:

http://burks.bton.ac.uk/burks/language/cpp/cppfaq/mixingca.htm#[29.3]

http://www.ddj.com/cpp/184403437?pgno=1

http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=/com.ibm.xlcpp8a.doc/language/ref/cplr020.htm

原创粉丝点击