我刚刚注意到,我给这个问题的一个答案实际上是行不通的:
无论是否使用CMake,以下内容都应适用于当前标准: 字符串资源= R"( #包含"text.txt“)";
我认为预处理器首先会识别#include "text.txt"语句并展开文本。
但显然不是这样,结果是
std::cout << resource << std::endl;是
#包括"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;
}输出是
#包括resource_name \
下面是要播放的演示
是否可以使用预处理器或任何其他常规的text.txt语言特性将text.txt资源导入c++-11原始字符串文本?
免责声明:
我很清楚上面的样品出了什么问题,为什么这些样品会这样失效。这是一个问题,预处理器忽略了出现在"对中的内容。
那么,有什么办法可以让预处理器看到这些东西呢?
发布于 2016-06-03 21:06:30
在标准的C++中这似乎是不可能的
问题0:只有标准的文本包含方式是#include指令。
Problem 1:String文字是一个预处理令牌,在第3阶段中被识别,所以当在第4阶段执行预处理指令时,已经确定#include是字符串文字的一部分,而不是预处理指令。
预处理-令牌: 电话报头名称 再分配识别 C.= 相对应字符 用户定义-字符-文字 C_ 用户定义-字符串-文字 /T1456-1993再加工再加工操作或操作 每一个非空白字符都不能成为上述字符之一
问题2:不可能在源中引入预处理指令并通过宏替换执行它:
16.3.4/3 所产生的完全由宏替换的预处理令牌序列不作为预处理指令处理,即使它类似于一个。
因此,您不能在宏中使用#include。
问题3:宏替换列表应该是有效的预处理令牌:
控制线: #定义标识符替换-列表新行 替换名单: pp-令牌: 预处理-令牌 标记预处理.令牌
而字符串文本本身是一个预处理标记,您不能从多个宏构建字符串文本。
https://stackoverflow.com/questions/37622767
复制相似问题