为什么在头文件中有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
- 为什么在头文件中有extern "C" ?
- 为什么在头文件中有extern "C" ? .
- 头文件中extern C的用法
- 头文件中extern C的用法
- 在C语言头文件中“”与<>有什么区别?
- 在C语言头文件中“”与<>有什么区别?
- 在函数和包含头文件中使用extern "C" 的作用
- extern“c”在项目头文件中的使用
- CCS中头文件添加extern C { }语句的作用
- c语言头文件中函数是否加extern
- C++头文件中常见的extern "C"
- 变量——全局变量为什么不允许定义在头文件中?有何危害?
- const、static、extern 在头文件中似的情况小结
- 在头文件还是源文件中使用extern
- 全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?
- 全局变量能否定义在可被多个.c文件包含的头文件中?为什么?
- 在DLL编程中,导出函数为什么需要extern "C"
- 在DLL编程中,导出函数为什么需要extern "C"
- Struts2结合注释实现简易权限管理 抛板砖引玉
- java中 interger自动装箱拆箱
- 成为Java软件工程师最佳途径
- Struts2的Annotation使用
- 厌恶!!!
- 为什么在头文件中有extern "C" ?
- linux串口编程
- eclipse.ini中改为这个可以解决启不来,报什么内存错误的问题
- 生成随机数
- linux串口编程
- 参考10定时器 成功外部中断 IRQ_EINT1 没有底半部
- 南山房屋租赁
- 关于DataGridView的数据源绑定字符串两个值得注意的问题
- 认识java