头文件和包含的最佳实践

7
我是一名能翻译文本的助手。
我有一个关于头文件、包含语句和良好编码风格的问题。假设我有两个带有相关源代码和头文件的类,然后是一个包含main()函数的最终源代码文件。
在Foo.hpp中,我有以下语句:
#include <string>
#include <iostream>
#include <exception>

现在在Bar.hpp文件中,我有以下语句:

#include "Foo.hpp"
#include <string>

最后,在Myprogram.cpp文件中,我有以下语句:

#include "Bar.hpp"
#include <string>
#include <iostream>
#include <exception>

我知道在Myprogram.cpp和Bar.hpp中的<>包含语句并不是程序编译和运行所必需的,但是做事情的最佳实践或正确方式是什么?是否有不明确地在每个文件中包含必要的头文件的原因?


在 "Foo.hpp" 中,你使用字符串、流还是异常? - Martin York
2个回答

15

您应该在每个需要它们的文件中包含所有必要的文件。 如果MyProgram.cpp需要string,请包含它,而不是依赖于Bar.hpp包含它。 两周后,无法保证Bar.hpp仍将包含它,然后您将面临编译器错误。

请注意必要性 - 即确保您实际上需要这个include,当有前向声明或甚至完全省略时就可以做到。

还要注意,一些系统头文件可能会包含其他文件 - 除了极少数例外,没有要求。因此,如果您需要iostream和string,请同时包含这两个文件,即使您只能用其中一个进行编译。

包含顺序(系统包含与用户包含)取决于您遵循的编码标准 - 一致性比选择本身更重要。


2
但反过来也是如此,除非确实需要它们(即不要过度包含),否则不应在头文件中包含头文件。 - Martin York
我认为在用户包含文件之前添加系统包含文件是有道理的,因为你永远不知道将来会有哪些开发人员向用户头文件添加宏,这可能会破坏系统头文件。 - Neutrino

4
包含每个文件所需的内容,但不要包含任何不需要的文件。通常,被包含的文件的职责是确保它不会被重复包含,使用预编译器标志等方法...
例如,如果Foo.cpp需要bar.h,但Foo.h不需要,则在Foo.cpp中包含它而不是在Foo.h中包含。如果两者都需要,请在两者中都包含。
顺带提一下,最佳实践是不要在头文件中使用using指令。如果需要,可以在实现文件(.cpp)中使用using指令。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接