0

可能重复:
使用 C++ 头文件的最佳实践
C++ - .h 文件应该包含哪些内容?

我知道这可能是一个微不足道的问题,但我真的很困惑。

  • 您应该如何在头文件中组织代码实体?

例如,将每个类声明放在头文件中。全球实体怎么样?我需要将每个声明放在不同的文件中吗?或者把一些相关的放在一个文件中?还是其他一些原则来确定呢?

示例 1

// A common header file of "common.h"
#include <vector>
#include <memory>
#include <algorithm>
#include <string>
#include <cmath>

或者只是在需要时包括它们。

示例 2

// A header file "report.h" to include functions to report some information
class string;
void Log(std::string& info); // show in a log window
void Message(std::string& info); // show in a message box
void Status(std::string& info); // show in a status bar

或将它们拆分为 3 个文件。

4

1 回答 1

2

首先要记住的是头文件是供其他文件使用的;它应该只包含某些服务的消费者使用该服务所需的信息。单个源文件中的程序不需要标头(对于它定义的函数;它会用于它使用的“系统”函数)。标头用于确保服务提供者和服务消费者之间的一致性。

[你] 把每个类声明放在一个头文件中吗?

不,很多课程,但肯定不是每个课程。

如果一个类只被源文件中的代码使用,那么文件之外的任何东西都不需要知道这个类。类应该在源文件中指定,而不是在头文件中。

即使在接口中使用了一个类,也要仔细考虑是否需要详细的声明,或者提供该类的前向声明是否足够。

全球实体怎么样?

除了函数之外,您不应该有很多“全局实体”。尽可能避免使用全局变量。如果其他文件需要全局实体,则应在适当的标题中声明它,通常但不总是定义它所属的类的标题。如果仅在单个文件中需要“全局实体”,则应在适当的名称空间(通常是匿名名称空间)中定义它。

我需要将每个声明放在不同的文件中吗?

不,您将它们组合在一起。考虑标准 C++ 库。许多标头定义了多个声明。但是每个标头都定义了一组相关的声明。您想在将所有内容分成不同的标题和拥有如此多的标题之间取得平衡,您找不到任何东西。

第一条经验法则是“每个定义服务的源文件一个标头”。但是,必须明智地使用它。

如果需要多个源文件来实现完整的服务集,那么单个标头可以为完整的服务集提供外部定义(并且可能会有第二个私有标头仅由实现服务的源文件使用,定义他们需要在彼此之间共享的细节,而不与消费者共享)。

在另一个极端,有时一个源文件会实现几组服务。如果这些服务没有密切相关,那就是不寻常的——糟糕的工程。如果它们是相关的,那么单个标题就足够了。我想一个源文件可以有两个公共头文件,但这种情况非常不寻常。

于 2013-01-27T18:49:10.090 回答