如何在构建时将文件的内容放入我的C ++字符串中?

时间:2010-05-15 01:29:51

标签: c++ string include

我有一个我在C ++中编译的文件,其中我希望有一个字符串,其值是编译时文件的内容。

换句话说,我想#include这个文件但是在双引号内。

如何在C ++中执行此操作?

现在如果该文件包含双引号作为其文本的一部分该怎么办?如何将这些文件转义?

5 个答案:

答案 0 :(得分:5)

您可以使用xxd -i /tmp/your_file > /tmp/your_file_as_string.c

将为您定义字符串文字:

$ cat /tmp/your_file_as_string.c
unsigned char _tmp_inc[] = {
  0x2e, 0x2f, 0x42, 0x61, 0x74, 0x63, 0x68, 0x2f, 0x6e, 0x65, 0x78, 0x74,
  0x4f, 0x6f, 0x6c, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f,
  ...
  0x74, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x65, 0x63,
  0x0a
};
unsigned int _tmp_inc_len = 1513;

现在您可以使用该定义的字符串。

答案 1 :(得分:2)

我能想到的唯一方法是从文件中生成另一个文件作为预编译步骤。您可以构建一个小工具,它将为您完成。该实用程序可以处理双引号,您可以在构建文件

中编译之前调用它

答案 2 :(得分:2)

要在字符串中正确创建具有正确空终止的标头,请使用sed:

xxd -i ${INPUT_FILE_NAME} | sed s/}\;/,0x00}\;/ > ${INPUT_FILE_PATH}.h

有关详细信息,请参阅http://gamesfromwithin.com/quick-tip-working-with-shaders-on-ios

答案 3 :(得分:1)

一种显而易见的(如果有点天真)方式是进行系统调用并调用cpp -x c++ file.cpp,然后将流的内容直接读入字符串,就像任何其他文件读取操作一样。

这将在C ++模式下调用file.cpp上的C预处理器,这与在其上运行#include ...完全相同。然后,该值将存储在string对象中。

答案 4 :(得分:1)

尝试查看您的编译器/链接器套件是否有一个名为bin2obj的程序。如果它存在,它通常会接受任何文件并生成.o.obj文件,您可以指示链接器链接到您的程序。 (如何做到这一点因构建环境而异。)

通常情况下,您最终会得到一个或两个符号,这些符号可以让您的代码可见:

extern "C" const char * myFile_start;
extern "C" unsigned int myFile_size;

链接器将确保myFile_start指向文件的开头,myFile_size为您提供长度的指示。

符号名称可能会有所不同:您可以使用objdumpnmdumpbin实用程序(同样,取决于编译器/链接器套件)来调查生成的{{1 }或.o查找符号名称(如果它们尚未记录在您的.obj工具文档中)。

请注意,这会使您的可执行文件(通常是obj2bin.data部分或等效文件)膨胀,这在某些平台上可能会出现问题。

(如果您没有bin2obj,您可以通过使用您的编译器/ IDE名称在搜索引擎上搜索“bin2obj”找到一个。)