有没有办法使用预处理器将文本资源拉入原始字符串文字?
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 \
是否有任何技巧可以使用预处理器或任何其他常规 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
并且字符串文字本身就是一个预处理标记,您不能从多个宏构建字符串文字。
我刚刚注意到我为
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 \
是否有任何技巧可以使用预处理器或任何其他常规 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
并且字符串文字本身就是一个预处理标记,您不能从多个宏构建字符串文字。