【问题标题】:Which C++ header includes which other headers?哪个 C++ 标头包含其他哪些标头?
【发布时间】:2012-10-08 14:00:20
【问题描述】:

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

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

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

【问题讨论】:

  • 你的意思是标题,是吗?永远不要依赖任何东西,包括任何其他东西。始终明确包含您需要的内容。无法保证其中包括哪些其他人(编辑:关于c++11,我似乎错了)。
  • 这是一道 C 题吗?如果没有,请删除标签。
  • 这在 C 和 C++ 中是不同的。确定你要问的是哪一个。

标签: c++ stream include static-libraries


【解决方案1】:

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

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

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

【讨论】:

  • 1. #include <initializer_list> 需要几个 C++11 头文件;正如您所提到的,我认为这是除<iostream> 之外的唯一此类要求。 2. C++ 头文件允许将名字插入全局命名空间,并且要求将名字放入std; C 头文件 允许将名称插入 std 并要求将名称放入全局命名空间。
  • @PeteBecker:我知道,但这不是重点。问题是任何标头都应该被允许静默包含<cstdio>,但如果标头这样做,我相信不允许printf放在全局命名空间中,仅在@987654331中@。只有当你明确包含<stdio.h> 时,你才能得到保证,如果你明确包含<cstdio>,你可能会或可能不会在全局命名空间中获得printf
  • 我明白了:你的观点比我想象的要微妙得多。我认为不需要分开,但我没有引用。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

        #ifndef MACRO_NAME #define MACRO_NAME

        #endif

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-12-24
          • 2016-01-21
          • 1970-01-01
          • 2018-05-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多