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

Is there a way to pull in a text resource into a raw string literal using the pre-processor?

我刚刚注意到我为 给出的答案实际上不起作用:

Regardless of using CMake or not, the following should work with the current standard:

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 原始字符串文字?


免责声明:

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

那么有没有办法避免这些被预处理器看到?

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

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

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

preprocessing-token:
    header-name
    identifier
    pp-number
    character-literal
    user-defined-character-literal
    string-literal
    user-defined-string-literal
    preprocessing-op-or-punc
    each non-white-space character that cannot be one of the above

问题2: 无法在源码中带预处理指令用宏替换执行:

16.3.4/3
The resulting completely macro-replaced preprocessing token sequence is not processed as a preprocessing directive even if it resembles one

所以你不能在宏中运行 #include

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

control-line:
    # define identifier replacement-list new-line
replacement-list:
        pp-tokens opt
pp-tokens:
    preprocessing-token
    pp-tokens preprocessing-token

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