2013-03-14 114 views
4

我有一个关于头文件,包含语句和良好编码风格的简短问题。假设我有2个关联了源文件和头文件的类,然后是main()所在的最终源文件。头文件和包含最佳做法

在Foo.hpp我有以下语句:

#include <string> 
#include <iostream> 
#include <exception> 

现在withing Bar.hpp我有以下语句:

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

最后withing Myprogram.cpp我有以下语句:

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

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

+0

在“Foo.hpp”中,你使用字符串,流或异常吗? – 2013-03-14 21:56:31

回答

9

应该包括所有必要的文件在每个需要它们的文件中。如果MyProgram.cpp需要string,请将其包括在内,而不要依赖于Bar.hpp。从现在开始Bar.hpp仍然包含它,不保证2周,然后您将留下编译器错误。

注意必要 - 即确保您实际上需要一个包含,当一个前向声明或甚至完全离开它将做。

此外,请注意,某些系统标题可能包含其他 - 除少数例外情况外,没有要求。因此,如果您同时需要<iostream><string>两种版本,即使只能使用其中一种进行编译。

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

+1

但是反过来也是如此,除非你确实需要它们(即不要包含),否则你不应该包含头文件(在头文件中)。 – 2013-03-14 21:57:44

+0

@LokiAstari true。 – 2013-03-14 22:00:29

+0

有道理。谢谢。 – boulderprog 2013-03-14 22:07:08

2

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

例如,如果是由Foo.cpp需要的,而不是由Foo.h,包括它在Foo.cpp没有Foo.h。如果两者都有要求,则包括在两者中。

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