假设我正在编辑一些大型 C++ 源文件,并且我添加了几行碰巧使用的代码auto_ptr
,如下例所示。
#include <string>
// ... (much code here)
void do_stuff()
{
std::string str("hello world");
// ... (much code here too)
std::auto_ptr<int> dummy; // MY NEW CODE
// ...
}
此示例在 gcc 3.4.4 (cygwin) 上编译,因为标准头<string>
恰好包含标题<memory>
需要编译auto_ptr
。然而,这在 gcc 4.5.0 (mingw) 上不起作用;他们似乎已经清理了头文件之类的东西。
所以,当我添加使用的代码时auto_ptr
,我是否应该立即去查看该文件是否包含#include <memory>
一开始,如这个答案 https://stackoverflow.com/questions/3945899/should-i-include-a-header-that-is-already-included-via-other-headers/3945920#3945920暗示?我从来不这样做(我觉得这太烦人了);我总是依靠编译器来检查是否有#include
不见了。
是否有任何选项不会破坏编码并确保我的代码的可移植性?
是否有一个 C++ 标准库实现,其标头相互包含的内容不会超出所需范围?
如果您使用标准库中的某些内容,则应该包含定义它的标头。这是唯一的便携式选择。这样,您就可以避免引用的实例,其中一个标头恰好在一个版本或编译器中包含另一个标头,但不包含另一个标头。auto_ptr
定义于<memory>
,所以如果您使用它,请包含该标头。
[编辑...]
回答您的评论...您是否询问编译器是否可以帮助检测您何时使用未直接包含的标准标头中的某些内容?这会很有帮助,但我认为这个要求有点太多了。这需要编译器知道哪些标准库标头包含哪些标准库定义,然后检查您是否为所使用的定义包含了正确的标头。
准确确定how包含标题也是一项艰巨的任务。如果您使用标准库定义,那么您必须以某种方式包含标头。编译器必须判断您是否自己包含该标头(可能通过您自己或第三方库的标头),或者它是否来自另一个标准库标头。 (例如,在您的示例中,它必须能够区分<memory>
被纳入通过<string>
或包含在您自己的代码中。)
它必须处理不同版本的标准库(例如 C++03 与 C++0x)和不同的供应商。如果第三方 stdlib 的供应商不完全遵循标准,那么您可能会收到有关要包含哪些标头的错误警告。
我这么说只是为了尝试解释(以我有限的编译器/stdlib 知识)为什么我不认为编译器具有此功能。我确实同意,这会很有帮助,但我认为成本大于收益。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)