4

我对哪个标准库曾经包含哪个其他标准库感到困惑。我听说iostream包括ostream或类似的东西。不幸的是,我找不到概述。这就是我现在问的原因。

我的程序使用以下库:string, fstream, iostream, sstream, streambuf. 因为它们提供了相关的功能,所以我想知道其中是否已经包含其他功能。在这种情况下,我可以摆脱多余的包含。

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

4

5 回答 5

7

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

(我相信 C 库头文件有一个特殊规定——我认为除非您明确包含这些头文件,否则您不会在全局命名空间中获得名称。)

一些标头确实有特定要求;例如,在 C++11(但不是之前)中,需要同时<iostream>包含<ostream><istream>。但这只是一种特殊情况。

于 2012-10-08T14:04:11.550 回答
2

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

于 2012-10-08T14:04:45.987 回答
1

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

于 2012-10-08T14:03:32.830 回答
1

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

可能std::string从您包含的其他一些系统标头中“免费”获得是无关紧要的。不要依赖那些幕后的人包括在内。

于 2012-10-08T14:07:08.283 回答
1

如果您担心重复包含,它们将通过宏处理,例如

#ifndef MACRO_NAME #define MACRO_NAME

#万一

所以你不需要担心多个包含我猜。

于 2012-10-08T14:34:24.343 回答