首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有一种使用预处理器将文本资源导入原始字符串文本的方法?

是否有一种使用预处理器将文本资源导入原始字符串文本的方法?
EN

Stack Overflow用户
提问于 2016-06-03 20:22:41
回答 1查看 1.7K关注 0票数 5

我刚刚注意到,我给这个问题的一个答案实际上是行不通的:

无论是否使用CMake,以下内容都应适用于当前标准: 字符串资源= R"( #包含"text.txt“)";

我认为预处理器首先会识别#include "text.txt"语句并展开文本。

但显然不是这样,结果是

代码语言:javascript
复制
std::cout << resource << std::endl;

#包括"text.txt“

我试图使用一些宏让#include语句在内部展开,但是它也不起作用:

代码语言:javascript
复制
#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原始字符串文本?

免责声明:

我很清楚上面的样品出了什么问题,为什么这些样品会这样失效。这是一个问题,预处理器忽略了出现在"对中的内容。

那么,有什么办法可以让预处理器看到这些东西呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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-令牌: 预处理-令牌 标记预处理.令牌

而字符串文本本身是一个预处理标记,您不能从多个宏构建字符串文本。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37622767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档