我有一个项目,其中使用 Bison 生成解析器。项目本身是用 SCons 构建的,我所有的代码都是用 C++ 编写的。一开始我决定将代码分成 3 个主要目录:includes、src 和 test,其中第一个可以只包含公共头文件,src包含实现和私有头文件,而test只包含测试。
目前这个约定被 3 个文件打破:stack.hh、position.hh和location.hh。它们是由 Bison 自动生成的,因为我在 C++ 模式下使用它。但是,虽然我可以使用参数--defines=include/namespace/parser.hpp来设置解析器的头文件应该放在哪里,但我找不到定义这 3 个文件应该放在哪里的方法,所以它们保存在同一个文件夹中src/命名空间/parser.cpp。
我想知道如何干净地处理它。到目前为止,我提出了 2 个想法:首先是使用%define和api.location将其设置为当前使用的类(这将阻止 Bison 再次生成这些文件),然后将这些文件移动到那里。另一种是我自己重新实现位置和位置类并使用所述api设置它们。一个想法对我来说听起来像是一个肮脏的黑客,而另一个想法对于这样一个简单的任务来说是一种过度杀伤力。
是否有任何其他(干净的)方法可以确保解析器使用的帮助器将放置在包含目录中,而src将仅包含实现?
编辑:
这些文件(或它们的替换文件)应该放在公共头文件夹中的原因是它们被包含在Bison 生成的parser.hpp文件中。因此,如果不将这些文件添加到搜索文件夹列表中,我将无法编译任何包含 parser.hpp 的文件。目前我必须添加到源文件夹的路径以包含,以便编译器可以找到仅在 1 个地方需要的这 3 个文件:生成的 parser.hpp 标头,我无法控制它。这是无关紧要和令人困惑的,所以我想把它改正。