#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]