注册 登录
编程论坛 C++教室

请教用include包含头文件和用using namespace将名字空间中定义的头文件中的符号的区别

hsnr 发布于 2012-04-14 17:51, 7557 次点击
在C++编程中我们经常使用include将一个头文件中声明的内容包含到当前文件中,也就是可以使用在include包含头文件中声明的符号。同样,我觉得使用using namespace也有类似的作用,但是为什么包含了符号声明的头文件,还有用using namespace使用名字空间呢?不是多此一举吗?当然,我知道我的理解不对,但我解释不了这两种用法的区别,请高手予以解答。
13 回复
#2
ab10349827492012-04-14 18:43
不用using namespace std;
则与处理要这样写:#include<iostream.h>
而用了using namespace std;
则要这样写:
#include<iostream>
using namespace std;
#3
hsnr2012-04-14 18:49
我说如果是自己写的头文件,不是系统预定义的。
#4
wxl2494248202012-04-14 20:03
首先要先区分#include<iostream> 和#include<iostream.h>;
这两个的区别就是后面一个没有一个有  .h  
#include<iostream>  为标准头文件。它是C++规范的带有命名空间的头文件,它包含在 std 命名空间内。
C++引入命名空间 namespace 就是为了减少和避免命名冲突。程序较大的时候就很难避免重名了。所以都要事先声明 用的是命名空间里的函数或者变量;
所以 要用 using namespace 。。
#include<iostream.h> 为非标准头文件。该头文件是C语言格式的,由于当时还没有“命名空间”个说法,借用2楼的例子,也就是说不存在std 这个命名空间标识符,所以用iostream.h 时也就用不着using namespace std;

#5
pangding2012-04-15 00:54
include 是包含进来, using 是用。包进来和用它还是有区别的。
程序代码:
#include <iostream>
using namespace std;

namespace my_namespc {
    int a = 5;
}

int main()
{
    int a = 1;
    cout << a << endl;
    cout << my_namespc::a << endl;

    using namespace my_namespc;
    cout << a << endl;

    return 0;
}
像这个例子,名空间就在本地,但你不 using 的话,还是不能自动就用的。

[ 本帖最后由 pangding 于 2012-4-15 00:58 编辑 ]
#6
hsnr2012-04-15 11:06
回楼上:
我是不是可以这样理解您的意思,“包含”是指存在对象的声明(或定义),但是只有“用”它才能在包含的地方使用?也就是两个东西必须配合使用才行?关于#include 和using namespace 的确有不明晰的地方,一般书上也讲的不清不楚。
#7
小跳蚤2012-04-15 13:21
2楼正解
#8
lintaoyn2012-04-15 15:27
有了#include,可以支持你把源代码拆为成几个文件。#include本身应该只是把几个文件凑在一起给编译器看。而namespace是为了防止命名冲突和名字污染。
#9
pangding2012-04-15 18:45
回复 6楼 hsnr
不是呀。我在 using 之前不是也通过 my_namespc::a 的方法使用了 my_namespc 里的内容了吗?

在 using 之前,就只能使全称(准确的说是要通过名空间限定的方法来引用)。using 语句有两种用法,一种是
using my_namespc::a;
一种是:
using namespace my_namespc;
前一种是声明,后文中的 a 指带的是 my_namespc 中的 a。
而后者是声明,后文中所用的所有标识符都先从 my_namespac 中查寻。相当于是把名空间中所有的东西都拉过来用。

我在置顶的 学习笔记 里也提到了一点有关名空间的东西,但内容不是很丰富就是了。那个帖子里,这两种用法都出现了。

[ 本帖最后由 pangding 于 2012-4-15 18:47 编辑 ]
#10
hsnr2012-04-15 20:23
回复9楼
我把您的程序运行了一遍,怎么第三个a输出也是1啊?费解哦。
#11
pangding2012-04-16 22:52
回复 10楼 hsnr
哦?你用的什么编译器?
#12
lyswwr2012-04-17 21:39

 
C++中新定义的方法都是有名字空间的 比如cout就属于std名字空间 如果include头文件的时候加上.h,默认会using namespace 否则需要自己加上 using namespace XXX 对于C中已经定义的方法如printf,没有影响的

iostream.h是包含输入/输出流处理的头文件,iostream就什么都不是了
但用iostream要加名词空间namespace

#include<iostream.h>
或者是
#include<iostream>
using namespace std;
二者都行

#include<iostream.h>是C语言中比较通用的
#include<iostream>
using namespace std;
是C++中比较通用的

#include <iostream.h>这样写,里面的函数都是全局函数.

不加.h的是现在C++中规定的标准,目的在于使C++代码用于移植和混合嵌入时不受扩展名.h的限制,避免因为.h而造成的额外的处理和修改
而加.h的是c语言的用法,但是在c++中也支持这种用法,主要是为了向下兼容c 的内容,我们平时尽量不用这种方法
iostream是现在C++中规定的标准,目的在于使C++代码用于移植和混合嵌入时不受扩展名.h的限制,避免因为.h而造成的额外的处理和修改。 iostream包含的基本功能和对应的旧头文件相同,但头文件的内容在名字空间std中。(在标准化的过程中,库中有些部分的细节被修改了,所以旧头文 件和新头文件中的实体不一定完全对应。)  

#13
hsnr2012-04-18 08:53
回10楼  我用的编译器是Visual Studio 2005
#14
lyswwr2012-04-18 23:15
C++中新定义的方法都是有名字空间的 比如cout就属于std名字空间 如果include头文件的时候加上.h,默认会using namespace 否则需要自己加上 using namespace XXX 对于C中已经定义的方法如printf,没有影响的

iostream.h是包含输入/输出流处理的头文件,iostream就什么都不是了
但用iostream要加名词空间namespace

#include<iostream.h>
或者是
#include<iostream>
using namespace std;
二者都行

#include<iostream.h>是C语言中比较通用的
#include<iostream>
using namespace std;
是C++中比较通用的

#include <iostream.h>这样写,里面的函数都是全局函数.

不加.h的是现在C++中规定的标准,目的在于使C++代码用于移植和混合嵌入时不受扩展名.h的限制,避免因为.h而造成的额外的处理和修改
而加.h的是c语言的用法,但是在c++中也支持这种用法,主要是为了向下兼容c 的内容,我们平时尽量不用这种方法
iostream是现在C++中规定的标准,目的在于使C++代码用于移植和混合嵌入时不受扩展名.h的限制,避免因为.h而造成的额外的处理和修改。 iostream包含的基本功能和对应的旧头文件相同,但头文件的内容在名字空间std中。(在标准化的过程中,库中有些部分的细节被修改了,所以旧头文 件和新头文件中的实体不一定完全对应。) 一般情况下应该用这个头文件,而iostream.h则是老式的,以后有可能被淘汰。

经常在CSDN以及其他之类的技术论坛上问关于C++ 头文件的问题。提出这些问题的往往就是那些刚学C++的新手。当初我是菜鸟的时候也问过类似的问题。


现在来看看下面两个include:


#include<iostream> // 这个就是1998年标准化以后的标准头文件


#include<iostream.h> // 这个就是标准化以前的头文件




更本质上的区别就是iostream把标准C++库的组件放在一个名位std的namespace里面。而相对的iostream.h则将这些标准组件放在全局空间里,同时在标准化以后旧有的C标准库也已经经过改造了。 使用前者,就需要在代码中添加语句:using namespace std;

1