哪个C ++标头包含哪些其他标头?

时间:2012-10-08 14:00:20

标签: c++ stream include static-libraries

我很困惑哪个标准库包括哪一个。我听说iostream包含ostream或类似内容。不幸的是我找不到概述。这就是我现在问的原因。

我的程序使用以下库:字符串,fstreamiostreamsstreamstreambuf。因为它们提供了相关的功能,我想知道其中任何一个是否已包含其中一个。在这种情况下,我可以摆脱多余的包含。

是否有概述表明哪个标准库包含哪个?我的程序中哪些用户库是多余的?

5 个答案:

答案 0 :(得分:7)

对于任何类型的递归包含,C ++都不提供任何保证。您有责任始终包含您需要的所有标题。同样,它不保证任何特定的标准库头都包含 。 (例如,您的实现可以合法地始终包含所有标准库头!)这就是为什么 - 因为所有内容都在std命名空间中。

(我相信C库标题有一个特殊的规定 - 我认为你不会在全局命名空间中获取名称,除非你明确包含这些标题。)

有些标题确实有特定要求;例如,在C ++ 11中(但不是之前),<iostream>必须同时包含<ostream><istream>。但这只是一个具体案例。

答案 1 :(得分:2)

您不能依赖任何其他标头包含的任何标头。最好明确包含您需要的一切。这样,如果您更改编译器,您可以确保不会破坏编译,以防新编译器没有相同的头包含结构。

答案 2 :(得分:1)

这可能会有所帮助:http://www.cplusplus.com/reference/iostream/iostream/ iostream继承自ostream和istream。

答案 3 :(得分:1)

我的规则:#include您正在使用的内容。如果您使用的是std::string,则需要#include <string>。如果您使用的是std::cout,则需要#include <iostream>。如果您使用的是文件流#include <fstream>。等等。

可能从您包含的其他系统标题中“免费”获取std::string是无关紧要的。不要依赖幕后的人。

答案 4 :(得分:1)

如果您担心重新包含,则可通过

等宏来处理

#ifndef MACRO_NAME    #define MACRO_NAME

#ENDIF

所以你不必担心多重包含我猜。