我有一个我在C ++中编译的文件,其中我希望有一个字符串,其值是编译时文件的内容。
换句话说,我想#include这个文件但是在双引号内。
如何在C ++中执行此操作?
现在如果该文件包含双引号作为其文本的一部分该怎么办?如何将这些文件转义?
答案 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
为您提供长度的指示。
符号名称可能会有所不同:您可以使用objdump
或nm
或dumpbin
实用程序(同样,取决于编译器/链接器套件)来调查生成的{{1 }或.o
查找符号名称(如果它们尚未记录在您的.obj
工具文档中)。
请注意,这会使您的可执行文件(通常是obj2bin
或.data
部分或等效文件)膨胀,这在某些平台上可能会出现问题。
(如果您没有bin2obj,您可以通过使用您的编译器/ IDE名称在搜索引擎上搜索“bin2obj”找到一个。)