为什么在头文件中有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++编译器就不会自动对要调用的函数进行名字改编了。
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++编译器就不会自动对要调用的函数进行名字改编了。
相关文章推荐
- 为什么在头文件中有extern "C" ?
- 在函数和包含头文件中使用extern "C" 的作用
- extern "C" include C开发库头文件时必须加
- 在DLL编程中,导出函数为什么需要extern "C"
- C++调用C函数,为什么要加extern "C"?
- 在C++程序中调用被C编译器编译后的函数,为什么要加extern "C"?
- #ifdef #ifndef extern "c"与头文件
- __declspec(dllexport),extern "c"与.def文件
- 为什么下载文件文件名太长就会被截取,但是用<a href="">就不会有文件名超长的问题?!
- vs2005 "automation服务器不能创建对象"解决方法. -- 安装好VS2005 SP1为什么还是不能创建WEB文件
- extern "C"与.def文件的作用
- 在DLL编程中,导出函数为什么需要extern "C"
- 为什么在开始菜单里面点msconfig会出现windows找不到文件"msconfig"?
- 在C++程序中调用被C 编译器编译后的函数,为什么要加 extern "C"
- 为什么在C++里调用被C编译器编译的函数,要加extern "c"
- SQL数据库无法附加,提示 MDF" 已压缩,但未驻留在只读数据库或文件组中。必须将此文件解压缩
- extern "c"使用
- extern "C" ZZ
- extern "C"用法详解
- extern "C"的惯用法