【问题标题】:Header files and include best practice头文件并包含最佳实践
【发布时间】:2013-03-03 11:42:32
【问题描述】:

我有一个关于头文件、包含语句和良好编码风格的快速问题。假设我有 2 个类与相关的源文件和头文件,然后是 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”中你使用字符串、流还是异常?

标签: c++ class header include


【解决方案1】:

应该在每个需要它们的文件中包含所有必要的文件。如果MyProgram.cpp 需要string,则包含它,而不是依赖它被Bar.hpp 包含。不能保证 2 周后 Bar.hpp 仍会包含它,然后您将遇到编译器错误。

注意必要的 - 即确保你确实需要一个包含,当一个前向声明甚至完全忽略它时就可以了。

另外,请注意,某些系统标头可能包含其他标头 - 除了少数例外,没有任何要求。因此,如果您同时需要 &lt;iostream&gt;&lt;string&gt; 两者,即使您只能使用其中之一进行编译。

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

【讨论】:

  • 但反之亦然,除非确实需要,否则不应包含头文件(在头文件中)(即不要过度包含)。
  • 我认为在用户包含之前添加系统包含是有意义的,因为您永远不知道下线的某些开发人员何时会将宏添加到可能会破坏系统标题的用户标题。
【解决方案2】:

在每个文件中包含您需要的所有内容,但不要包含您不需要的任何文件。通常,包含文件的工作是确保它没有被包含两次,使用预编译器标志等...

例如,如果 Foo.cpp 需要,但 Foo.h 不需要,则将其包含在 Foo.cpp 中而不是 Foo.h 中。如果两者都需要,请同时包含。

切线,作为最佳实践,永远不要在头文件中使用using 指令。如果需要,可以在实现文件 (.cpp) 中使用 using 指令。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    • 2019-01-19
    • 1970-01-01
    • 2018-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多