C++头文件包含的基本问题是什么?

6
以下三个程序有什么区别?<iostream>是头文件还是C++标准库?

1.

#include<iostream>
using namespace std;

int main()
{
        return 0;
}

2.

#include<iostream>

int main()
{
        return 0;
}

3.

#include<iostream.h>

int main()
{
        return 0;
}

感谢您的预先帮助。

在第二个程序中,我没有包含命名空间,那会发生什么? - siva
2
你需要写成std::cout,而不是cout - Tyler McHenry
它看起来就像是一份学生作业……不是吗? - ereOn
1
请不要猜测作业标签。这显然不是复制粘贴的作业问题,而且任何学习C++语言的人都可能会想到这个问题。 - Tyler McHenry
我不是猜的:5年前我在一次考试中有一个非常类似的问题。 - ereOn
4个回答

14

就产生的程序而言,没有任何区别-由于程序中没有引用库中的任何内容,任何智能编译器都不会将该库编译进去。

当您使用#include <iostream>时,您正在包含具有iostream标准库声明的头文件。使用#include <iostream.h>#include <iostream>实际上基本相同,只是它将整个库的名称定义在全局命名空间中,而不是在std::中,这是为了向后兼容使用未删除.h的原始版本iostream的程序。(<iostream.h>版本通常也不支持宽字符,仅支持标准的char)。

using namespace std;表示当前文件中名称引用的默认命名空间将为std,这是大多数标准库函数使用的命名空间。虽然这意味着您不必在所有标准库调用前加上std ::前缀,但这也意味着您必须小心不要定义任何与标准库名称重叠的内容。


2
实际上,我相信 iostream.h 将东西放在全局命名空间中(尽管太阳下没有编译器实际这样做)。我可能是错的。 - Billy ONeal
3
@Billy说:"iostream.h"在C++标准中不存在,因此通常情况下它不起作用;需要指定具体实现。它是早期C++的遗物,在命名空间出现之前存在。在任何给定的实现上,它可能会执行与#include <iostream>相同的操作,然后使用指令将所有符号导出到全局命名空间。 - David Thornley

3

第三个问题中有一个头文件错误。

头文件iostream.h是非标准头文件,在所有平台上都不存在。事实上,在我的系统上(使用g++和GNU libstdc++),它并不存在。因此,任何使用它的代码都无法在我的系统上编译。

在C++于1998年首次标准化之前,iostream.h头文件曾经很常见。但自从98标准使用<iostream>代替<iostream.h>以来,后者已经不再受到青睐(因为它是非标准的),并且在所有平台上都不再受支持。使用它的代码应被视为非标准遗留代码,不可移植。教授它的书籍应被视为过时的并应予以避免。


2

iostream是一个头文件,提供了声明和原型,是C++标准库的一部分接口。

在您的系统上,有一个名为“iostream”(没有扩展名)的文件,其内容被复制并粘贴(带有#include的递归处理)到您编写#include <iostream>的位置。

#include指令总是会拉入头文件的内容,它们不会添加“库”。头文件通常包含了一些声明和原型,是库的接口,但实际的库本身是由链接器附加到您的程序中的,而不是编译器。在链接C++程序时,链接器会自动附加C++标准库,除非您告诉它不要这样做,因此您不必担心这个问题。

同样,using namespace std语句并不执行附加库的工作。该语句只是让您可以写例如coutstring,而不是将它们限定为std::coutstd::string。这对于任何命名空间都有效,但通常不建议这样做。

对于您给出的三个示例,它们都提供了使用C++标准库iostream部分所需的定义和原型,但(2)是首选,(1)是可接受的,(3)已被弃用。 (2)提供了额外的便利性,即可以省略std::前缀(代价是减少您自己可以使用的变量名称),而(3)包含一个名为“iostream.h”的不同文件,而不是“iostream”,这通常是相同的东西,但带有.h的文件是C++标准化之前的遗留物,因此可能在未来的编译器中不受支持。


1

你的前两个程序是标准的C++程序,而第三个程序使用了一个非标准的头文件<iostream.h>

在第一个程序中,using namespace std将整个命名空间std引入作用域。

请查看this以获取更多信息。


1
头文件从未成为任何C++标准的一部分,因此不能真正说它已被弃用,这在C++中具有特定的技术含义。 - anon
@Neil:http://www.devx.com/tips/Tip/14447 明确指出<iostream.h>是一个已弃用的头文件。此外,为了禁用使用<iostream.h>时出现的警告,我们使用gcc的-Wno-deprecated选项。那么我找不到<iostream.h>不能被称为弃用的原因?请详细说明。 - Prasoon Saurav
1
@Prasoon Saurav:那是devx.com,不是标准。 - Billy ONeal
1
谁在乎某个随意的互联网链接所说的?C++的弃用特性列在C++标准的D附录中。 - anon
2
关于“no-deprecated”标志的观点是合理的。也许“过时的”会是更好的描述?但最终,使用现代编译器就不应该使用iostream.h - Component 10
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接