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

标签 c++ bison abstract-syntax-tree

我正在用 Bison 制作解析树。目前,我为每个非终端分配一个类,为每个产品分配一个子类。问题是我每个类(class)都有一个标题,所以它们很多。我认为的解决方案是制作一个包含所有 header 的通用 header 。

当前项目结构示例:

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

公共(public) 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",问题是我读到这被认为是不好的做法,因为它会产生开销并增加编译时间。这个案子有理由这样做吗?解析器将始终使用所有 header 。

最佳答案

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

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

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

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

关于c++ - 为解析树实现制作一个通用头文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48969704/

相关文章:

c++ - 将整数变量附加到 C++ 中的 char 变量

c++ - 警告 : "IPPROTO_TCP" redefined warning: this is the location of the previous definition

c++ - Lex/Yacc 解析器解析列中包含标题和值的文件

parsing - 如何构建解析器以将 Lucene 语法解析为 AST

java - 如果项目使用 Java8,我如何通过静态分析检测?

c++ - 我如何创建 3d 边界框? (直接 3d 11,HLSL)

c++ - 如何修复 “a debugging check in this application has failed”错误?

html - 需要一个用于 HTML 的简单 Bison 语法

bison - "Unix Programming Environment"书中 Hoc1 的基本 Lex 文件

clang - Clang 项目的 AST