【问题标题】:Is there a way to pull in a text resource into a raw string literal using the pre-processor?有没有办法使用预处理器将文本资源拉入原始字符串文字?
【发布时间】:2016-10-04 00:22:00
【问题描述】:

我刚刚注意到我为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 原始字符串文字?


免责声明:

我很清楚上述示例有什么问题,以及为什么这些示例会以这种方式失败。预处理器会忽略出现在 " 对中的内容,这是一个问题。

那么有没有办法让预处理器看到这些?

【问题讨论】:

  • 您想将文本分配给变量还是将文本作为预处理器指令?
  • @ThomasMatthews 应该可以从示例中所示的变量访问文本。它应该用于初始化resource 字符串。
  • 不,不是不修改text.txt。这就是为什么会有这样的讨论和提议:groups.google.com/a/isocpp.org/forum/?fromgroups#!topic/…
  • 我不明白你想要完成什么。您不能#include 字符串变量中的内容。
  • 我认为预处理器没有办法。不过,您可以使用其他工具来做到这一点。 xxd -i 可以为您做到这一点。我以前用它在二进制文件中嵌入资源文件。

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


【解决方案1】:

在标准 C++ 中似乎不可能

问题 0:文本包含的唯一标准方式是 #include 指令。

问题一:字符串字面量是一个预处理token,在阶段3识别,所以在阶段4执行预处理指令时,已经确定#include是字符串的一部分文字而不是预处理指令。

预处理令牌:
标题名称
标识符
pp号
字面量
用户定义字符文字
字符串字面量
用户定义的字符串文字
预处理操作或穿孔
每个不能是上述之一的非空白字符

问题2:无法在源码中引入预处理指令并通过宏替换来执行:

16.3.4/3
生成的完全用宏替换的预处理标记序列不会作为预处理指令处理,即使它类似于一个

所以你不能在宏中使用#include

问题 3:宏替换列表应该是有效的预处理标记:

控制线:
#define identifier replacement-list new-line
replacement-list:
pp-tokens opt
pp-tokens:
预处理令牌
pp-tokens 预处理-token

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

【讨论】:

    猜你喜欢
    • 2012-11-18
    • 1970-01-01
    • 2012-08-07
    • 2011-02-23
    • 2019-04-04
    • 2011-08-22
    • 2013-12-14
    • 2019-09-18
    • 1970-01-01
    相关资源
    最近更新 更多