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

Dan*_*olf 5 c++ resources c-preprocessor

我有一个文本文件,其中包含我的应用程序所需的资源。该文件包含任意纯文本,而不是带有变量赋值的 C++ 代码。我不想将文本文件与我的申请一起发送;我更愿意将其编译到其中。所以我尝试了以下方法:

#include <iostream>
#include <string>

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

我希望#include第 6 行在预处理时执行,并替换为资源文件的内容。之后,编译器将看到带有资源数据的原始字符串文字。

然而,输出只是#include <textresource.txt>带有换行符的文本。显然,它#include从未被执行过。(我使用的是 Visual Studio 2015。)

为什么工作没有#include按预期进行?是否有其他语法可以在编译时将文本文件(而不是代码)导入到变量中?

Ton*_*roy 5

为什么#include 没有按预期工作?

C++ 标准的 2.2 翻译阶段列出了步骤:

  1. 源文件被分解为预处理标记(2.4)...

(在 2.4 预处理令牌下,您会发现字符串文字是令牌类型之一)

  1. 执行预处理指令

因此,包含文本的字符串文字"#include..."被正确标记为字符串文字,而不是任何受预处理指令执行影响的内容。

是否有其他语法可以在编译时将文本文件(而不是代码)导入到变量中?

不是 C++ 语言本身。您当然可以在您的构建系统中编排这个...调用一些 shell 或实用程序来将您想要的 C++ 源代码拼接在一起。特定的 C++ 编译器可能会提供非标准设施来促进这一点;您需要检查您感兴趣的编译器的文档。