在编译时将文本文件转换为字符串

时间:2016-05-27 16:06:08

标签: c++ cmake

我有一个带有一些类似C的纯文本的文本文件。我想在编译时(理想情况下使用cmake)获取此文件中的文本并使用它生成一个简单的C ++头文件 - 一个包含几个包含,名称空间声明和std的文件:: string,其值是我的文本文件的内容,新行和包含的所有内容。

最好的方法是什么?

1 个答案:

答案 0 :(得分:0)

好的,所以我选择了与此处建议的解决方案不同的解决方案。这就是我所做的。

在我的源代码中,我定义了一个处理程序类,我将使用我需要的字符串文字。这里有两件事很重要:

  • 在版本控制下,头文件实际上是.hpp.in。实施文件是正常的.cpp
  • 在此标头文件中,我选择一个变量并将其定义为#define MY_STRING @MY_STRING@

现在,在负责这两个文件的CMakeLists.txt中,我这样做:

  • 将原始文本文件读入cmake变量
  • 删除所有//个评论,将结果保存在临时变量中
  • 将所有\n个字符替换为字符串"newline",将结果保存为新的临时变量
  • 定义我在上面标题中使用的相同变量(即MY_STRING),并从最新的临时变量中分配
  • 通过指定.hpp,将标题从$ {CMAKE_SOURCE_DIR}下的位置复制到$ {CMAKE_BINARY_DIR}下的相应位置(并将其重命名为@ONLY)。这可确保cmake将复制头文件,但也会更新#define MY_STRING @MY_STRING@,其值为MY_STRING我设置得更早。

最后,在我的处理程序的实现文件中,我定义了以下宏:

#define STRINGIFY(x) #x
#define TOSTRING(x) STRINGIFY(x)

这样我就可以调用TOSTRING(MY_STRING)并将输出分配给std::string my_string。完成后,我需要做的就是用"newline"替换"\n"占位符字符串 - 我就完成了! my_string现在的值等于原始文本文件中的值(没有那里的注释)。

我希望我有更多的时间来玩这个,更少的其他任务来分散我的注意力,但事情就是这样,现在必须这样做。

谢谢大家的帮助!