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


4 Answers

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

即使标头不需要实现,也可以创建一个只包含该.h文件的.cpp,而不是其他内容。

这意味着您可以按照自己喜欢的方式回答问题。 你把它们包含在哪个顺序并不重要。

有关更多精彩提示,请尝试本书: 大规模C ++软件设计 - 很遗憾它是如此昂贵,但实际上它是C ++源代码布局的生存指南。

Question

标题/ 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 

它有点冗长,但确实节省了磁盘搜索,因为如果已经包含了标题,则不会搜索/打开标题。 如果没有防护检查,编译器将寻找并打开头文件,解析整个文件以最终#ifdef整个文件。




这是一个依赖性的东西,它在很大程度上取决于你在我们的标题中放置的内容。 事实是,你可能真的臭名昭着,并尽量减少你的包含严格,但你最终会遇到一个你想要使用包含警卫的场景。

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

问题在一开始并不明显,但随着软件复杂性的增加,依赖关系也会增加。 你可以做得很好,并且对它很聪明,但是更大的C ++项目通常都包含在内。 你可以尝试,但你只能这么做。 所以要勤奋并考虑你的包括,是的! 但是你肯定会在某些时候有循环依赖,这就是你需要包含守卫的原因。




Google C ++样式指南,名称和包含顺序

在dir / foo.cc中,其主要目的是在dir2 / foo2.h中实现或测试内容,请按以下方式订购包含:

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



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

一个很好的帮助是在构建仅包含其中一个的cpp文件(每个头文件一个)时测试头文件是否编译。




Related