我刚刚注意到我为this question给出的答案实际上不起作用:
无论是否使用CMake,以下内容都应符合当前标准:
std::string resource = R"( #include "text.txt" )";
我认为预处理器会首先识别#include "text.txt"
语句并展开文本。
但显然并非如此,
的结果std::cout << resource << std::endl;
是
#include "text.txt"
我尝试使用一些宏来扩展#include
语句,但它也不起作用:
#include <string>
#include <iostream>
#define RESOURCE_DEFINIION(resource_var,resource_name) \
const std::string resource_var = R"xxx( \
#include resource_name \
)xxx";
RESOURCE_DEFINIION(resource,"text.txt")
int main()
{
std::cout << resource << std::endl;
return 0;
}
输出
\ #include resource_name \
是否有任何技巧可以使用预处理器或任何其他常规c ++语言功能将text.txt
资源拉入c ++ - 11原始字符串文字中?
免责声明:
我很清楚上面的样品有什么问题,以及为什么这些都会失败。这是一个问题,预处理器会忽略"
对中出现的内容。
那么有没有办法逃脱预处理器看到的这些?
答案 0 :(得分:4)
在标准C ++中似乎不可能
问题0 :只有标准的文字包含方式是#include
指令。
问题1 :字符串文字是一个预处理标记,在阶段3中被识别,因此当在阶段4中执行预处理指令时,已经确定#include
是一部分字符串文字,而不是预处理指令。
预处理令牌:
之一
头名
标识
PP-数
字符文字
用户定义字符的字面
字符串字面
用户定义-字串文本
预处理-OP-或-PUNC
每个非空白字符,不能是上述
问题2 :无法在源代码中引入预处理指令并通过宏替换执行它:
<强> 16.3.4 / 3 强>
生成的完全宏替换的预处理标记序列不会作为预处理指令处理,即使它类似于一个
所以你不能在宏内部工作#include
。
问题3 :宏替换列表应该是有效的预处理标记:
控制线:
#define identifier replacement-list new-line
替换列表:
pp-tokens opt
PP-令牌:
预处理令牌
pp-tokens preprocessing-token
字符串文字本身就是一个预处理标记,你不能从几个宏构建字符串文字。