C++ 为解析树实现创建一个公共头文件
我正在野牛城做一棵解析树。目前,每个非终端有一个类,每个产品有一个子类。问题是我每个类有一个标题,所以它们很多。我认为解决方案是创建一个包含所有头的公共头 当前项目结构示例:C++ 为解析树实现创建一个公共头文件,c++,bison,abstract-syntax-tree,C++,Bison,Abstract Syntax Tree,我正在野牛城做一棵解析树。目前,每个非终端有一个类,每个产品有一个子类。问题是我每个类有一个标题,所以它们很多。我认为解决方案是创建一个包含所有头的公共头 当前项目结构示例: -ast --program.hh --decl.hh --.. --.. --.. --constants.hh 公共标头(例如common_header.hh)如下所示: #ifndef COMMON_HEADER_HH #define COMMON_HEADER_HH #include "program.hh" #
-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中,我只包含了#包含了“common_header.hh”
,问题是我读到这被认为是不好的做法,因为它会产生开销并增加编译时间。这个案子有理由这样做吗?在C++(和C)中,分析器总是使用所有的头。,合理地将每个翻译单元的大小减到最小是一个好的做法。创建包含许多其他头文件的单个头文件通常是一种糟糕的做法
但是,您似乎描述了一种情况,即任何包含这组标题的翻译单元都需要包含整个标题组。在这种情况下,无论你是直接还是通过一个怪物头间接包含它们,都无关紧要
不过,只有在许多翻译单元中使用怪物标题时,才有意义创建怪物标题。如果它只包含在一个翻译单元中,那么与显式地包含其中的所有标题相比,没有任何优势
monster头的另一个潜在优势是,您可能能够在构建时生成它,因为您的构建系统中已经有一个Bison语法文件列表。但这只是一个小小的方便,因为添加一个新的语法文件在添加使用它的代码之前是没有用的。如果是编译器,那么公共头通常是最好的。Fwiw,你所描述的不是AST。这是一个解析树。如果您正在编写编译器,则需要AST。@Gene:CST/AST的区别没有您预期的那么有用。看见解析树或AST的物理表示可能是相同的。@IraBaxter我构建了一些编译器,并尝试了两者。AST提供了一个更干净的实现。