为啥我不需要在 gcc 4.6 中包含 STL 标头?

Posted

技术标签:

【中文标题】为啥我不需要在 gcc 4.6 中包含 STL 标头?【英文标题】:Why don't I need to include STL headers in gcc 4.6?为什么我不需要在 gcc 4.6 中包含 STL 标头? 【发布时间】:2011-10-28 12:22:04 【问题描述】:

我在 c++0x 模式下使用 gcc 4.6。我注意到,如果我使用向量和其他 STL 容器但不包含它们关联的头文件,我似乎没有遇到任何编译器错误。这是设计使然吗?首选做法是什么?

我总是使用显式指定 std 命名空间...但我一直认为即使指定了命名空间也必须包含标头。

如果最好包含标头,这似乎是一个奇怪的默认值,因为在没有编译器帮助的情况下,我是否能 100% 正确处理事情是值得怀疑的。

【问题讨论】:

您可能通过其他标头间接包含它们。 检查程序包含的头文件,STL 头文件必须包含在其中一个头文件中。 嗯,没错,但是保持代码良好维护的首选做法是什么?并非总是可以避免在其他标头中包含 STL 标头(例如内联函数等) 【参考方案1】:

您应该始终包含代码所需的所有标准标头。

不幸的是,标准标头可以包含其他标准标头,在这种情况下,您可能会发现自己可以在不包含正确标头的情况下使用某些东西。你不能依赖它,如果你更改为不同的库实现,你可能会发现你必须修复你的包含。

没有简单的方法可以确保您始终获得正确的包含;最简单的选择是测试您的代码是否与您感兴趣的所有库实现一起编译。

【讨论】:

【参考方案2】:

赋予 GCC 的选项 -H(即在您的情况下为 g++)使 GCC 打印它包含的每个标题。它可以帮助您找出文件是如何被包含的(即来自哪个其他标题)。而且我不认为 GCC 神奇地包含了一些 stdc++ 头文件。

【讨论】:

以上是关于为啥我不需要在 gcc 4.6 中包含 STL 标头?的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows 上使用 Rtools 中包含的不同 gcc 版本和 Rcpp

如何在 GCC 搜索路径中包含头文件?

即使在 Ubuntu 20.04、编译器 gcc 9.3.0 中包含 string.h 后,也无法使用 strrev() 函数。我能做些啥? [复制]

在窗口中包含C(unistd.h)的基础库

为啥 AngularJS 在选择中包含一个空选项?

为啥在 Ruby 中包含模块的顺序会有所不同?