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按预期进行?是否有其他语法可以在编译时将文本文件(而不是代码)导入到变量中?
为什么#include 没有按预期工作?
C++ 标准的 2.2 翻译阶段列出了步骤:
- 源文件被分解为预处理标记(2.4)...
(在 2.4 预处理令牌下,您会发现字符串文字是令牌类型之一)
- 执行预处理指令
因此,包含文本的字符串文字"#include..."被正确标记为字符串文字,而不是任何受预处理指令执行影响的内容。
是否有其他语法可以在编译时将文本文件(而不是代码)导入到变量中?
不是 C++ 语言本身。您当然可以在您的构建系统中编排这个...调用一些 shell 或实用程序来将您想要的 C++ 源代码拼接在一起。特定的 C++ 编译器可能会提供非标准设施来促进这一点;您需要检查您感兴趣的编译器的文档。