将文本文件在编译时导入原始字符串字面量

4

我有一个包含应用程序需要的资源的文本文件。该文件包含任意纯文本,并非具有变量赋值的C++代码。我不想将文本文件与应用程序一起发布;我希望将其编译到应用程序中。因此,我尝试了以下方法:

#include <iostream>
#include <string>

int main() {
    std::string test = R"(
#include <textresource.txt>
)";
    std::cerr << test << std::endl;
}

我原以为第6行的#include会在预处理阶段执行,用资源文件的内容替换它。然后编译器会看到一个包含资源数据的原始字符串字面量。
然而,输出结果只是文本#include <textresource.txt>,周围有换行符。所以,#include似乎从未被执行。(我使用的是Visual Studio 2015。)
为什么#include没有按预期工作?是否有其他语法可以在编译时将文本文件(而不是代码)导入变量中?

非常相似的问题,尽管是针对C语言的:https://dev59.com/WXRC5IYBdhLWcg3wFdJx - Tony Delroy
2个回答

4
为什么#include不像预期那样工作?
C++标准的2.2翻译阶段列出了以下步骤:
3. 源文件被分解为预处理记号(2.4)...
(在2.4预处理记号下,您会发现字符串字面值是记号类型之一)
4. 预处理指令被执行
因此,包含文本“#include...”的字符串字面值被正确地标记为字符串字面值,而不是任何需要执行预处理指令的内容。
是否有其他语法可以在编译时将文本文件(而不是代码)导入变量中?
在C++语言中没有。当然,您可以在构建系统中进行编排...调用某些shell或实用程序来拼接所需的C++源代码。特定的C++编译器可能提供非标准设施来方便这一点;您需要查看您感兴趣的编译器的文档。

感谢您提供详细的答案和标准引用。这很有道理,解释了我得到的结果。我本来以为预处理指令在记号化之前执行。我的错! - Daniel Wolf

0

我不确定textresource.txt的内容是什么。但是你可以这样做。

文件textresource.c

#include <string>
static std::string myString {"Very large string content ........ you may be need proper escape character depending on your content."};

文件 main.cpp

#include <iostream>
#include <string>
#include "textresource.c"
int main() {
    std::string test = myString;
    std::cerr << test << std::endl;
}

我意识到我可以将数据放入字符串文字中,然后导入该字符串。我的问题的要点是,我正试图使用预处理器为我生成此字面量。我已编辑问题,以使其清楚,资源文件包含任意文本,而不是代码。 - Daniel Wolf
好的。正如Tony D上面所回答的那样,你不能直接这样做,但你必须在你的构建系统中进行一些修改,以便它可以将文件内容提供到某个变量中。 - Manthan Tilva

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接