为解析树实现制作一个通用头文件

时间:2018-02-25 02:35:15

标签: c++ bison abstract-syntax-tree

我在Bison做了一个解析树。目前,每个非终端都有一个类,每个生产都有一个子类。问题是每个类都有一个标题,所以它们很多。我认为解决方案是制作一个包含所有标题的公共标题。

当前项目结构示例:

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

公共标题(比如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",问题是我读到这被认为是不好的做法,因为它会产生开销并增加编译时间。这种情况是否合理?解析器将始终使用所有标头。

1 个答案:

答案 0 :(得分:1)

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

但是,您似乎在描述一种情况,其中任何包含任何此类标头的翻译单元都需要包含整个标头组。在这种情况下,无论是直接还是间接地通过单个怪物标题包含它们都无关紧要。

但是,如果它将在许多翻译单元中使用,那么创建怪物标题才有意义。如果它只包含在一个翻译单元中,那么明确包括那里的所有标题都没有优势。

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