我有一个包含我的应用程序所需资源的文本文件。该文件包含任意纯文本,不带有变量赋值的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
没有按预期工作?是否有其他语法在编译时将文本文件(而不是代码)导入变量?
答案 0 :(得分:4)
为什么#include的工作没有按预期进行?
C ++标准版2.2翻译阶段列出了步骤:
- 源文件被分解为预处理令牌(2.4)......
醇>
(在2.4预处理令牌下,您会发现 string-literals 是令牌类型之一)
- 执行预处理指令
醇>
因此,将包含文本"#include..."
的字符串文字正确地标记为字符串文字,而不是任何需要执行预处理指令的内容。
是否有其他语法会在编译时将文本文件(而不是代码)导入变量?
不适合C ++语言。您当然可以在构建系统中编排这个...调用一些shell或实用程序来拼接您想要的C ++源代码。特定的C ++编译器可以提供非标准的工具来促进这一点;您需要查看您感兴趣的编译器的文档。
答案 1 :(得分: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;
}