C ++在运行时评估包含文件

时间:2017-09-15 13:31:30

标签: c++ regex parsing eval

我需要做的是"微调"一些常量值应该与程序的其余部分一起编译,但我想在每次更改时验证结果,而不必修改值并每次重新编译整个程序。所以我在考虑一种纯文本配置文件,每当我更改其中的数字时重新加载,并重新初始化程序的一部分以对新值采取操作。这是我经常做的事情,但这次我想做的是使用以下语法将此配置文件置于有效包含文件的形式下:

const MyStructure[] = 
{
  { 1, 0.5f, 0.2f, 0.77f, [other values...] },
  { 3, 0.4f, 0.1f, 0.15f, [other values...] },
  [other rows...]
};

如果我使用Perl这样的解释性语言,我已经使用了eval()函数,如果C ++无法使用该函数。虽然我已经阅读了有关在C ++中使用eval()函数的可能性的其他问题,但我想要的不是评估和运行此代码,只是为了解析它并将值放在它们所属的变量中。

我可能会使用正则表达式来解析上面的C语法,但同样,RegExp仍然不值得在C ++中使用,所以你能建议一种替代方法吗?

值得一提的是,我只需要在开发阶段解析此文件。当程序准备好发布时,我会#include

1 个答案:

答案 0 :(得分:0)

编写自己的解析器可能比适用于此用例的工作更多。

更简单的解决方案是将包含变量的文件单独编译为共享对象或DLL,可以在运行时动态加载。 (精确的细节取决于您的操作系统。)如果需要,您也可以在程序初始化期间调用编译器。

如果您不想处理查找符号并将其复制到静态变量的复杂性,您还可以将程序的大部分编译为共享对象,只需要一个小垫片作为主要可执行文件。垫片会:

  • 如有必要,请调用编译器以创建数据共享对象

  • 动态加载数据共享对象

  • 动态加载程序共享对象,

  • 使用它的main入口点(可能使用不同的名称)调用主程序。

要生成生产版本,只需要将程序和数据一起编译,并在没有垫片的情况下直接使用它。

根据具体需求,可以对此主题进行变更。