您的位置:首页 > 编程语言 > C语言/C++

头文件标准格式

2016-01-15 18:54 495 查看
/*
为什么标准头文件都有类似以下的结构?
*/

#ifndef _EXAMPLE_H_
#define _EXAMPLE_H_

#ifdef __cplusplus      //__cplusplus是c++编译器内部定义的一个宏定义
extern "C"              //用c语言标准编译
{
#endif  //{

/*...*/

#ifdef __cplusplus
}
#endif  //}

#endif  //_EXAMPLE_H_
/*


标准答案讲解:

头文件中的编译宏
#ifndef _EXAMPLE_H_
#define _EXAMPLE_H_
#endif
的作用是防止被重复引用。

作为一种面向对象的语言,C++支持函数重载,
而过程式语言C则不支持。函数被C++编译后在symbol库中的名字与C语言的不同。
例如,假设某个函数的原型为:
void foo(int x, int y);

该函数被C编译器编译后在symbol库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字。
_foo_int_int这样的名字包含了函数名和函数参数数量及类型信息,
C++就是靠这种机制来实现函数重载的。

为了实现C和C++的混合编程,C++提供了C连接交换指定符号extern "C"来解决名字匹配问题,
函数声明前加上extern "C"后,则编译器就会按照C语言的方式将该函数编译为_foo,
这样C语言中就可以调用C++的函数了。
这里写代码片


自己的见解

总结基本在标准答案中,以后自己编程按照该模版来操作

不同编译器,编译后的效果不一样,该写法兼容c/c++

这样编写程序的由来:

在c++编译环境下,要以用c语言方式编译代码
可以使用下面的方式,extern "C" 块语句以c语言标准编译

extern "C"
{
//c语言代码
}

但是上面的写法放在c环境下编译可能通过,可能报错,就是c++有的语法,关键字
比如 class,new就编译不通过

于是乎得用到c/c++共同的语法---条件编译,根据不同环境替换成不同的代码
这样编译就ok

而且__cplusplus是c++编译器内部定义的一个宏定义

所以改造后

#ifdef __cplusplus      //__cplusplus是c++编译器内部定义的一个宏定义
extern "C"              //用c语言标准编译
{
#endif  //{

//c code

#ifdef __cplusplus
}
#endif  //}

既能在c++也能在c环境下编译通过
把要编写的c语言代码放入extern "C" 中
把要编写的C++代码放入
#ifdef __cplusplus
//c++ code
#endif

注意:这个只是头文件中
这是条件编译一个应用,也是移植代码的典型实例,自己得好好掌握
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 标准