繁体   English   中英

确定#include的标准头文件

[英]Deciding which standard header files to #include

假设我正在编辑一些大型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>碰巧包含了编译auto_ptr所需的头文件<memory> 但是,这不适用于gcc 4.5.0(mingw); 他们似乎已经清理了他们的头文件或其他东西。

所以,当我添加使用auto_ptr代码时,我应该立即查看文件是否在开头包含#include <memory>这个答案意味着什么? 我从来没有这样做(我觉得太烦人了); 我总是依赖编译器来检查是否缺少#include

是否有任何选项不会破坏编码,并确保我的代码的可移植性?

是否有一个C ++标准库实现,其标题不是必需的彼此包含?

如果在标准库中使用某些内容,则应包括定义它的标头。 这是唯一的便携式选择。 这样你就可以避免你引用的实例,其中一个标题恰好包含在一个版本或编译器中,而不是另一个。 auto_ptr<memory>定义,因此如果您使用它,请包含该标头。

[编辑...]

回答你的评论......你是否在询问编译器是否可以帮助检测何时使用标准头文件中没有直接包含的内容? 这会有所帮助,但我认为这有点太多了。 这将要求编译器知道哪些标准库头包含哪些标准库定义,然后检查是否包含了所使用定义的正确库头。

确切地确定如何包含标题也是一项艰巨的任务。 如果您使用的是标准库定义,则必须以某种方式包含标题。 编译器必须告诉您是否自己包含标头(可能通过您自己的标头或第三方库)或者是否通过另一个标准库标头。 (例如,在您的示例中,它必须能够通过<string>或包含在您自己的代码中来区分<memory>之间的区别。)

它必须处理标准库的不同版本(例如C ++ 03 vs C ++ 0x)和不同的供应商。 如果那些第三方stdlib的供应商不完全遵循标准,那么你可能会收到关于要包含哪些标头的错误警告。

我只是这样说试图解释(用我有限的编译器/ stdlib知识)为什么我不认为编译器有这个功能。 我同意,这会有所帮助,但我认为成本超过了收益。

最好的方法是包含定义构造的正确头。 和Include文件应该通过使用“保护”文件的宏来防止多重包含

通常头文件包含它们的“包含警戒”。 警卫由以下人员组成:

MyHeader.h:

#ifndef __MY_HEADER_H__
#    define __MY_HEADER_H__

     //body of MyHeader.h

#endif

因此,您可以根据需要多次包含MyHeader.h:

#include "MyHeader.h"
#include "MyHeader.h"
#include "MyHeader.h"
#include "MyHeader.h"

并且它不会对编译器造成任何问题(它只会被包含一次)。 此外,您可以包含另一个包含“MyHeader.h”的文件,并应用相同的规则。

这意味着,如果你想使用标题中定义的东西 - 包括它! (即使你认为其他东西可能包括它,也没有理由不安全)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM