制作一个通用 header 文件用于解析树实现

Making one common header file for parse tree implementation

我正在用 Bison 制作解析树。目前我每个 non-terminal 有一个 class,每个作品有一个 subclass。问题是每个 class 我有一个 header,所以它们很多。我认为的解决方案是制作一个包含所有 header 的通用 header。

当前项目结构示例:

-ast
--program.hh
--decl.hh
--..
--..
--..
--constants.hh

常见的header(比如common_header.hh)看起来像:

#ifndef COMMON_HEADER_HH
#define COMMON_HEADER_HH
#include "program.hh"
#include "decl.hh"
// a lot of includes here
#include "constants.hh"
#endif //COMMON_HEADER_HH

所以在 Bison 中我只包含 #include "common_header.hh",问题是我读到这被认为是不好的做法,因为它会产生开销并增加编译时间。这个案子有理由这样做吗?解析器将始终使用所有 headers.

在 C++(和 C)中,最好将每个翻译单元的大小最小化到合理的程度。创建包含许多其他文件的单个 header 文件通常是一种糟糕的做法。

但是,您似乎在描述这样一种情况,即任何包含这组 header 中任何一个的翻译单元都需要包含整个 header 组。在这种情况下,直接包含它们还是通过单个怪物间接包含它们并不重要 header.

不过,如果要在许多翻译单元中使用它,那么创建怪物 header 才有意义。如果它只包含在一个翻译单元中,与显式包含所有 header 相比没有任何优势。

怪物 header 的另一个 潜在 优势是,如果您已经有了 Bison 语法列表,您也许可以在构建时生成它构建系统中某处的文件。但这是一个很小的便利,因为在添加使用它的代码之前,添加一个新的语法文件是没有用的。