我在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"
,问题是我读到这被认为是不好的做法,因为它会产生开销并增加编译时间。这种情况是否合理?解析器将始终使用所有标头。
答案 0 :(得分:1)
在C ++(和C)中,最好将每个翻译单元的大小最小化到合理的范围。创建包含许多其他文件的单个头文件通常是一种不好的做法。
但是,您似乎在描述一种情况,其中任何包含任何此类标头的翻译单元都需要包含整个标头组。在这种情况下,无论是直接还是间接地通过单个怪物标题包含它们都无关紧要。
但是,如果它将在许多翻译单元中使用,那么创建怪物标题才有意义。如果它只包含在一个翻译单元中,那么明确包括那里的所有标题都没有优势。
怪物标题的另一个潜在优势是,您可以在构建时生成它,因为您已经在构建系统中的某处有一个Bison语法文件列表。但这是一个非常小的便利,因为在添加使用它的代码之前添加新的语法文件是没有用的。