有没有办法使用预处理器将文本资源拉入原始字符串文字?

时间:2016-06-03 20:22:42

标签: c++ c++11 c-preprocessor string-literals

我刚刚注意到我为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 \                                                                                                                                                                

Here's the demo to play with

是否有任何技巧可以使用预处理器或任何其他常规c ++语言功能将text.txt资源拉入c ++ - 11原始字符串文字中?

免责声明:

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

那么有没有办法逃脱预处理器看到的这些?

1 个答案:

答案 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

字符串文字本身就是一个预处理标记,你不能从几个宏构建字符串文字。