组织包括

Def*_*ult 22 c++ include

  • 是否有一些首选方式来组织包含指令?
  • 是否更好地在文件中包含所需的.cpp文件而不是.h文件?翻译单位是否受到影响?
  • 如果我在.h文件和.cpp文件中都需要它,我应该将它包含在.h文件中吗?这有关系吗?
  • 将已定义的文件保存在预编译的头文件(stdafx.h)中,例如std和第三方库,这是一个好习惯吗?我自己的文件怎么样,我应该在stdafx.h创建它们的过程中将它们包含在文件中?

// myClass.h
#include <string>
// ^-------- should I include it here? --------

class myClass{
    myClass();
    ~myClass();

    int calculation()
};

// myClass.cpp
#include "myClass.h"
#include <string>
//  ^-------- or maybe here?  --------

[..]

int myClass::calculation(){
    std::string someString = "Hello World";
    return someString.length();
}


// stdafx.h
#include <string.h>
// ^--------- or perhaps here, and then include stdafx.h everywhere? -------
Run Code Online (Sandbox Code Playgroud)

Bjö*_*lex 25

  1. 您应该将它们放在文件的顶部,所有这些都在一个地方.这是每个人都期望的.此外,将它们分组是有用的,例如,首先是所有标准标题,然后是第三方标题(按库分组),然后是您自己的标题.在整个项目中保持此顺序一致.它使得理解依赖关系变得更容易.正如@James Kanze指出的那样,将声明内容的标头放在首位也很有用.这样你就可以确保它首先包含它是有效的(这意味着它不依赖于它不包括它自己的任何包含).
  2. 保持范围尽可能小,以便标题中的更改影响最少的翻译单元数.这意味着,只要可能,cpp只在-file中包含它.正如@Pedro d'Aquino所评论的那样,你可以尽可能使用前向声明来减少标题中包含的数量(基本上每当你只使用对给定类型的引用或指针时).
  3. 两者 - 显式优于隐式.
  4. 经过一些阅读后,我相信如果您确信它们不再发生变化,您应该只在PCH中包含标题.这适用于所有标准标头以及(可能)第三方库.对于你自己的图书馆,你是法官.

  • +1所有非常好的建议.我的经验法则是在任何文件(包括.cpp或.h)中包含最小数量的标头以使其编译,这意味着大多数包含在.cpp中,其中包含.h. (3认同)
  • 只需对订单进行快速评论:无论一般规则如何,都应始终首先包含定义源内容的标头(以确保在首先包含它时将进行编译). (2认同)

Oza*_*ray 7

这篇关于Header文件包含模式的文章应该对你有所帮助.

  • 是否有一些首选方式来组织包含指令?

是的,您可以在上面的文章中找到它们.

  • 是否更好地在.cpp文件中包含所需的文件而不是.h文件?翻译单位是否受到影响?

是的,最好将它们放在.cpp中.即使如果在另一种类型的定义中需要定义类型,也可以使用前向声明.

  • 如果我在.h文件和.cpp文件中都需要它,我应该将它包含在.h文件中吗?这有关系吗?

仅在.h文件中,但建议在头文件中转发声明,并包含在.cpp文件中.

  • 将已定义的文件保存在预编译的头文件(stdafx.h)中,例如std和第三方库是一种好的做法吗?我自己的文件怎么样,我应该在创建它们的过程中将它们包含在stdafx.h文件中?

我个人没有使用过预编译的头文件,但之前在Stackoverflow上已经讨论过它们:

预编译的标题?我们真的需要它们吗?


vin*_*nes 5

是否有一些首选方式来组织包含指令?

没有共同的惯例.有人建议对它们进行字母排序,我个人不喜欢它,并且更喜欢将它们保持逻辑分组.

是否更好地在.cpp文件中包含所需的文件而不是.h文件?

一般来说,是的.它减少了编译器打开和读取头文件的次数,只是为了查看那里的包含保护.这可能会缩短整体编译时间.有时也建议在头文件中尽可能多地转发声明类,并且实际上只在.cpp中包含它们,原因相同.例如,"Qt人"这样做.

翻译单位是否受到影响?

从语义上讲,没有.

如果我在.h文件和.cpp文件中都需要它,我应该将它包含在.h文件中吗?这有关系吗?

只需将其包含在标题中即可.

将已定义的文件保存在预编译的头文件(stdafx.h)中,例如std和第三方库是一种好的做法吗?我自己的文件怎么样,我应该在创建它们的过程中将它们包含在stdafx.h文件中?

预编译头可以显着减少编译时间.例如:我的一个项目包括boost::spirit::qiPCH开启20秒内的编译,以及80秒内的编译 - 没有.一般来说,如果你使用一些大量模板填充的库boost,你会想要利用PCH的优势.

至于代码示例中的问题:由于您不在标头中使用std :: string,最好将其包含在.cpp文件中.这是正常的,以#include <string>stdafx.h太-但是这只会增加复杂性的一点点你的项目,你会发现几乎没有任何编译加速.