您的位置:首页 > 运维架构 > Linux

linux下的c++头文件:namespace

2012-09-18 09:41 429 查看
linux下的C++编程与windows下是有不同的,主要就在于头文件。

windows下的头文件都是.h文件,比如VC6.0。现在linux下的头文件都是没有.h的,因为,我用的g++编译器

版本较高,所以就会出现这样的区别。

比如最常用的C++头文件iostream

<iostream>和<iostream.h>是不一样,前者没有后缀,实际上,在你的编译器include文件夹里面可以看到,二者是两个文件,打开文件就会发现,里面的代码是不一样的。

后缀为.h的头文件c++标准已经明确提出不支持了,早些的实现将标准库功能定义在全局空间里,声明在带.h后缀的头文件里,c++标准为了和C区别开,也为了正确使用命名空间,规定头文件不使用后缀.h。

因此,当使用<iostream.h>时,相当于在c中调用库函数,使用的是全局命名空间,也就是早期的c++实现;当使用<iostream>的时候,该头文件没有定义全局命名空间,必须使用namespace std;这样才能正确使用cout

那么namespace的意思是什么呢?

所谓namespace,是指标识符的各种可见范围。

C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。

由于namespace的概念,使用C++标准程序库的任何标识符时,可以有三种选择:

1、直接指定标识符。例如std::ostream而不是ostream。完整语句如下:

std::cout << std::hex << 3.4 << std::endl;

2、使用using关键字。

using std::cout;

using std::endl;

以上程序可以写成

cout << std::hex << 3.4 << endl;

3、最方便的就是使用using namespace std;

例如:

#include <iostream>

#include <sstream>

#include <string>

using namespace std;

这样命名空间std内定义的所有标识符都有效(曝光)。就好像它们被声明为全局变量一样。那么以上语句可以如下写:

cout << hex << 3.4 << endl;

因为标准库非常的庞大,所程序员在选择的类的名称或函数名时就很有可能和标准库中的某个名字相同。所以为了避免这种情况所造成的名字冲突,就把标准库中的一切都被放在名字空间std中。但这又会带来了一个新问题。无数原有的C++代码都依赖于使用了多年的伪标准库中的功能,他们都是在全局空间下的。

所以就有了<iostream.h>和<iostream>等等这样的头文件,一个是为了兼容以前的C++代码,一个是为了支持新的标准。

命名空间std封装的是标准程序库的名称,标准程序库为了和以前的头文件区别,一般不加".h"

C++标准头文件列表

传统 C++

#i nclude <assert.h>    //设定插入点

#i nclude <ctype.h>     //字符处理

#i nclude <errno.h>     //定义错误码

#i nclude <float.h>     //浮点数处理

#i nclude <fstream.h>    //文件输入/输出

#i nclude <iomanip.h>    //参数化输入/输出

#i nclude <iostream.h>   //数据流输入/输出

#i nclude <limits.h>    //定义各种数据类型最值常量

#i nclude <locale.h>    //定义本地化函数

#i nclude <math.h>     //定义数学函数

#i nclude <stdio.h>     //定义输入/输出函数

#i nclude <stdlib.h>    //定义杂项函数及内存分配函数

#i nclude <string.h>    //字符串处理

#i nclude <strstrea.h>   //基于数组的输入/输出

#i nclude <time.h>     //定义关于时间的函数

#i nclude <wchar.h>     //宽字符处理及输入/输出

#i nclude <wctype.h>    //宽字符分类

//////////////////////////////////////////////////////////////////////////

标准 C++ (同上的不再注释)

#i nclude <algorithm>    //STL 通用算法

#i nclude <bitset>     //STL 位集容器

#i nclude <cctype>

#i nclude <cerrno>

#i nclude <clocale>

#i nclude <cmath>

#i nclude <complex>     //复数类

#i nclude <cstdio>

#i nclude <cstdlib>

#i nclude <cstring>

#i nclude <ctime>

#i nclude <deque>      //STL 双端队列容器

#i nclude <exception>    //异常处理类

#i nclude <fstream>

#i nclude <functional>   //STL 定义运算函数(代替运算符)

#i nclude <limits>

#i nclude <list>      //STL 线性列表容器

#i nclude <map>       //STL 映射容器

#i nclude <iomanip>

#i nclude <ios>       //基本输入/输出支持

#i nclude <iosfwd>     //输入/输出系统使用的前置声明

#i nclude <iostream>

#i nclude <istream>     //基本输入流

#i nclude <ostream>     //基本输出流

#i nclude <queue>      //STL 队列容器

#i nclude <set>       //STL 集合容器

#i nclude <sstream>     //基于字符串的流

#i nclude <stack>      //STL 堆栈容器    

#i nclude <stdexcept>    //标准异常类

#i nclude <streambuf>    //底层输入/输出支持

#i nclude <string>     //字符串类

#i nclude <utility>     //STL 通用模板类

#i nclude <vector>     //STL 动态数组容器

#i nclude <cwchar>

#i nclude <cwctype>

using namespace std;

//////////////////////////////////////////////////////////////////////////

C99 增加

#i nclude <complex.h>   //复数处理

#i nclude <fenv.h>    //浮点环境

#i nclude <inttypes.h>  //整数格式转换

#i nclude <stdbool.h>   //布尔环境

#i nclude <stdint.h>   //整型环境

#i nclude <tgmath.h>   //通用类型数学宏
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: