[C++] C ++标题顺序


Answers

好的做法:每个.h文件都应该有一个.cpp,其中包含.h首先在其他任何地方。 这证明任何.h文件可以放在第一位。

即使头文件不需要实现,也可以创建一个.cpp文件,其中只包含.h文件。

这意味着你可以用任何你喜欢的方式回答你的问题。 不管你把他们包括进去的顺序都没有关系。

如果您想了解更多的技巧,请尝试下面这本书: 大规模C ++软件设计 - 这太遗憾了,它太贵了,但它实际上是C ++源代码布局的生存指南。

Question

在header / cpp文件中应该声明什么顺序? 很显然,后面的头文件所需要的应该是更早的,并且类特定的头文件应该在cpp作用域而不是头作用域中,但是有没有一个设置顺序约定/最佳实践?




我发现以下惯例是最有用的:

module.cpp:

// this is the header used to trigger inclusion of precompiled headers
#include <precompiled.h> 
// this ensures that anything that includes "module.h" works
#include "module.h"
// other headers, usually system headers, the project

重要的是把模块的头部作为第一个非预编译的头部。 这确保“module.h”没有意外的依赖关系。

如果您正在使用较慢的磁盘访问时间的大型项目,我已经看到这种方式用于减少构建时间:

module.cpp:

// this is the header used to trigger inclusion of precompiled headers
#include <precompiled.h> 
// this ensures that anything that includes "module.h" works
#include "module.h"
// other headers, usually system headers, the project
#if !defined _OTHER_MODULE_GUARD_
#include "other_module.h"
#endif 

#if !defined _ANOTHER_MODULE_GUARD_
#include "another_module.h"
#endif 

它有点冗长,但在磁盘上保存,因为如果已经包含头部,头部将不被搜索/打开。 如果没有进行保护检查,编译器会寻找并打开头文件,解析整个文件,最终将整个文件解析出来。




这是一个依赖的东西,它很大程度上取决于你放在我们的标题。 一个事实是,你可以真的臭名昭着,最小化,以保持你的包括严格,但你最终会遇到一个情况,你会想用包容卫士。

#ifndef MY_HEADER_H
#define MY_HEADER_H
//...
#endif

问题一开始并不明显,但随着软件复杂性的增长,您的依赖性也会随之增加。 你可以做得很好,并且聪明一点,但是更大的C ++项目通常充斥着include。 你可以试试,但是你只能这么做。 所以要勤奋,想想你的包括,是的! 但是,在某些时候,你肯定会有循环依赖,这就是为什么你需要包容守卫。




“如何”不是显而易见的,而是“什么”。 你的目标是确保包含头文件的顺序永远不重要(我的意思是“永远不!”)。

一个很好的帮助是测试头文件编译时,编译cpp文件(每个头文件一个),只包括其中之一。




Google C ++风格指南,包含的名称和顺序

在dir / foo.cc中,其主要目的是实现或测试dir2 / foo2.h中的东西,命令你的包括如下:

  • dir2 / foo2.h(首选位置 - 请参阅下面的详细信息)。
  • C系统文件。
  • C ++系统文件。
  • 其他库的.h文件。
  • 您的项目的.h文件。