16.为什么标准头文件都有类似以下的结构?

来源:互联网 发布:php电影播放器源码 编辑:程序博客网 时间:2024/06/05 16:36

#ifndef __INCvxWorksh 
#define __INCvxWorksh 
#ifdef __cplusplus 
extern "C" {

#endif 
/*...*/ 
#ifdef __cplusplus 

#endif 
#endif /* __INCvxWorksh */

答:头文件中的
#ifndef __INCvxWorksh 
#define __INCvxWorksh
#endif /* __INCvxWorksh */ 
是为了防止该头文件被重复include。
头文件中的 
#ifdef __cplusplus 
extern "C" {

#endif 
/*...*/ 
#ifdef __cplusplus 
}
是说明C++程序要调用C语言的函数。
C++支持重载,而C不支持,他们在编译后的符号表里的表示方法不同。例子:
void foo(int x, int y);
在C语言里中,编译后符号表中为_foo;而C++中编译后符号表中为_foo_int_int,不仅包含函数名,还包括形参类型,用此来
区分重载函数。
在C/C++混合编程中,extern "C"有两种用法:
1)在C++中定义函数,编译成库,然后再编写一个C程序来调用刚才写的C++库,那么链接报错,解决办法是在C++中的每个函数定义
(注意是定义,就是说在实现函数的地方)前声明extern "C",告诉编译器,你给我按C语言的形式编译,此处不需使用#ifdef __cplusplus。
2)在C中定义函数,编译成库,然后编写一个C++程序来调用刚才写的C库,那么链接时报错,解决办法是在C中每个函数的声明(注意是声明,一般在头文件里)
为了方便,通常在头文件中整体做,使用
#ifdef __cplusplus 
extern "C" {
#endif 
....
#endif 
/*...*/ 
#ifdef __cplusplus 
}
#endif
告诉编译器,如果是C++过来用我,那么他得用C语言形式来用我。
大部分总结都没有我这个细致,其实extern "C"是有这2中用法的。

0 0
原创粉丝点击