请问包含头文件的问题

时间:2021-11-27 10:02:07
我看到有#include<iostream.h>或#include<iostream>,请问这两种有什么不同?为什么需用这两种头文件?
另:没有看到#include<stdio>,为什么没有呢?

9 个解决方案

#1


#include <iostream.h>是最原始版的头文件和#include <stdio.h>是一样的,
你可能不太明白这个,我就多说说#include <iostream>,它是新的C++标准,现在的C++有“名称空间”这个概念(这个内容有点多,上网搜搜),为了用户容易明白名称空间,C++就把头文件改成#include <iostream>了。 

没有看到#include <stdio>,为什么没有呢?
因为它是C语言的,C++的新标准不适合它

#2


#include <iostream>是标准c++
的写法,iostream中的所有内容都包含在名字空间std内。
所以使用#include <iostream>时一定后面紧跟
using namespace std;

支持#include <iostream.h>的写法是为了向下兼容。

#3


#include <iostream.h>//c++标准以前
相当于
#include <iostream> 
using namespace std;

#4


标准C++建议这样搞
#include <cstdio>

#5



//标准C++,不加.h
#include <iostream>
using namespace std;


//这是C的头文件,所以.h
include <stdio.h>

#6


引用 1 楼 anglecloudy 的回复:
#include <iostream.h>是最原始版的头文件和#include <stdio.h>是一样的, 
你可能不太明白这个,我就多说说#include <iostream>,它是新的C++标准,现在的C++有“名称空间”这个概念(这个内容有点多,上网搜搜),为了用户容易明白名称空间,C++就把头文件改成#include <iostream>了。 

没有看到#include <stdio>,为什么没有呢? 
因为它是C语言的,C++的新标准不适合它

建议在C++上还是用#include<iostream>
加上命名空间      using namespace std;

#7


有#include <cstdio>

#8


引用 1 楼 anglecloudy 的回复:
#include <iostream.h>是最原始版的头文件和#include <stdio.h>是一样的, 
你可能不太明白这个,我就多说说#include <iostream>,它是新的C++标准,现在的C++有“名称空间”这个概念(这个内容有点多,上网搜搜),为了用户容易明白名称空间,C++就把头文件改成#include <iostream>了。 

没有看到#include <stdio>,为什么没有呢? 
因为它是C语言的,C++的新标准不适合它 
 
建议在C++上还是用#include <iostream> 
加上命名空间      using namespace std;


UP! Right!

#9


无论是何种情况#include这个预处理符的作用就是把一个磁盘上的文件内嵌到当前文件中来。

所以不管是#include <stdio.h>还是#include <iostream.h>还是#inculude <iostream>都只是包含指定的文件。#include <iostream>就是包含一个名为iostream的文件,跟iostream.h本质上没有什么联系。(不要误以为iostream是iostream.h的一种特殊的表示方法之类的。)

在C++标准出现之前,C++用iostream.h作为它的IO流的库的头文件,当然为了跟C兼容,stdio.h这个标准输入输出库头文件也依然保留着。

在C++标准制定时,标准委员会意识到C++越来越多的库开放越来越多的全局名称会是一个问题,因此引入了名字空间(namespace)的机制。与此同时,把C++标准库中的全局名称全部统一放入std名字空间。为了避免混淆,把标准库所在头文件的文件名进行修改,去掉了.h的后缀(比如iostream.h变成iostream)。对于原来C标准库的部分,除了去掉.h后缀,还加上了前缀"c"(比如stdio.h变成cstdio)。于是对于大部分编译器来说,为了保证兼容性,就只能提供两套类似的头文件,比如iostream.h和iostream。两套头文件内容除了名字空间以外,通常很大程度上是一样的(很可能就是其中一个又#include了另一个),但也并不是完全相同的。

由于iostream中的名字都是在std名字空间中的,不能直接全局访问。所以常常会用using namespace std;把std名字空间开放到全局空间中,这样才能保证程序的其它部分可以正常的用原来的直接引用的方法来使用cout,cin,endl等标准库中的东西。这样的做法是可以的,但问题在于还是用太多的标准库中的名称污染了全局空间,所以更好的做法是用什么就using什么,比如:using std::cin; using std::cout; 等等。

#1


#include <iostream.h>是最原始版的头文件和#include <stdio.h>是一样的,
你可能不太明白这个,我就多说说#include <iostream>,它是新的C++标准,现在的C++有“名称空间”这个概念(这个内容有点多,上网搜搜),为了用户容易明白名称空间,C++就把头文件改成#include <iostream>了。 

没有看到#include <stdio>,为什么没有呢?
因为它是C语言的,C++的新标准不适合它

#2


#include <iostream>是标准c++
的写法,iostream中的所有内容都包含在名字空间std内。
所以使用#include <iostream>时一定后面紧跟
using namespace std;

支持#include <iostream.h>的写法是为了向下兼容。

#3


#include <iostream.h>//c++标准以前
相当于
#include <iostream> 
using namespace std;

#4


标准C++建议这样搞
#include <cstdio>

#5



//标准C++,不加.h
#include <iostream>
using namespace std;


//这是C的头文件,所以.h
include <stdio.h>

#6


引用 1 楼 anglecloudy 的回复:
#include <iostream.h>是最原始版的头文件和#include <stdio.h>是一样的, 
你可能不太明白这个,我就多说说#include <iostream>,它是新的C++标准,现在的C++有“名称空间”这个概念(这个内容有点多,上网搜搜),为了用户容易明白名称空间,C++就把头文件改成#include <iostream>了。 

没有看到#include <stdio>,为什么没有呢? 
因为它是C语言的,C++的新标准不适合它

建议在C++上还是用#include<iostream>
加上命名空间      using namespace std;

#7


有#include <cstdio>

#8


引用 1 楼 anglecloudy 的回复:
#include <iostream.h>是最原始版的头文件和#include <stdio.h>是一样的, 
你可能不太明白这个,我就多说说#include <iostream>,它是新的C++标准,现在的C++有“名称空间”这个概念(这个内容有点多,上网搜搜),为了用户容易明白名称空间,C++就把头文件改成#include <iostream>了。 

没有看到#include <stdio>,为什么没有呢? 
因为它是C语言的,C++的新标准不适合它 
 
建议在C++上还是用#include <iostream> 
加上命名空间      using namespace std;


UP! Right!

#9


无论是何种情况#include这个预处理符的作用就是把一个磁盘上的文件内嵌到当前文件中来。

所以不管是#include <stdio.h>还是#include <iostream.h>还是#inculude <iostream>都只是包含指定的文件。#include <iostream>就是包含一个名为iostream的文件,跟iostream.h本质上没有什么联系。(不要误以为iostream是iostream.h的一种特殊的表示方法之类的。)

在C++标准出现之前,C++用iostream.h作为它的IO流的库的头文件,当然为了跟C兼容,stdio.h这个标准输入输出库头文件也依然保留着。

在C++标准制定时,标准委员会意识到C++越来越多的库开放越来越多的全局名称会是一个问题,因此引入了名字空间(namespace)的机制。与此同时,把C++标准库中的全局名称全部统一放入std名字空间。为了避免混淆,把标准库所在头文件的文件名进行修改,去掉了.h的后缀(比如iostream.h变成iostream)。对于原来C标准库的部分,除了去掉.h后缀,还加上了前缀"c"(比如stdio.h变成cstdio)。于是对于大部分编译器来说,为了保证兼容性,就只能提供两套类似的头文件,比如iostream.h和iostream。两套头文件内容除了名字空间以外,通常很大程度上是一样的(很可能就是其中一个又#include了另一个),但也并不是完全相同的。

由于iostream中的名字都是在std名字空间中的,不能直接全局访问。所以常常会用using namespace std;把std名字空间开放到全局空间中,这样才能保证程序的其它部分可以正常的用原来的直接引用的方法来使用cout,cin,endl等标准库中的东西。这样的做法是可以的,但问题在于还是用太多的标准库中的名称污染了全局空间,所以更好的做法是用什么就using什么,比如:using std::cin; using std::cout; 等等。