是否可以在多行字符串文本中使用 C/C++ 预处理器令牌
Can you use C/C++ preprocessor tokens in multiline string literals
扩展这个问题和这个问题,是否可以使用所示的预处理器方法或包含预处理器符号值的多行字符串文本C++多行字符串文本。 例如:
#define SOME_CONSTANT 64
#define QUOTE(...) #__VA_ARGS__
const char * aString = QUOTE(
{
"key":"fred",
"value":"SOME_CONSTANT"
}
);
理想情况下,我希望将"SOME_CONSTANT"替换为"64"。
我尝试使用我有限的技能中的所有技巧,包括串化,但没有运气。
有什么想法吗?
你有两个问题。首先是引号内的预处理器标记(即字符串文本(不会被替换。第二种情况是,您必须推迟实际的字符串化,直到替换所有预处理标记。字符串化必须是预处理器处理的最后一个宏。
令牌替换以迭代方式进行。预处理器处理替换,然后返回以查看在刚刚替换的序列中是否还有任何要替换的内容。我们需要利用它来发挥我们的优势。如果我们有一个假设的TO_STRING
宏,我们需要下一次迭代来替换所有预处理令牌,并且只需要之后的迭代来生成对"真实"字符串化的调用。幸运的是,编写起来相当简单:
#define TO_STRING(...) DEFER(TO_STRING_)(__VA_ARGS__)
#define DEFER(x) x
#define TO_STRING_(...) #__VA_ARGS__
#define SOME_CONSTANT 64
#define QUOTE(...) TO_STRING(__VA_ARGS__)
const char * aString = QUOTE({
"key":"fred",
"value": TO_STRING(SOME_CONSTANT)
});
现场示例
我们需要DEFER
宏,因为预处理器不会在它识别为另一个宏的参数的东西中替换。这里的诀窍是,DEFER(TO_STRING_)(x)
中的x
不是宏的参数。所以它被替换为与DEFER(TO_STRING_)
相同的去.结果我们得到的是TO_STRING_(substituted_x)
.这将成为下一次迭代中的宏调用。因此,预处理器将在先前替换的x
上执行TO_STRING_
指示的替换。
相关文章:
- 错误:无效的预处理指令 #i 的意思是 #if?
- C++预处理会生成变量成员、资源库和映射
- 使用预处理指令检查是否包含标头?
- 预处理的 C/C++ 文件是否特定于计算机?
- 使用 GCC 对 C 文件进行部分预处理(不删除 "define" 指令)
- 在 CPLEX 中求解线性规划,无需剪切和预处理
- CPP -D 选项,用于预处理 Fortran 代码
- 错误:粘贴"tmp_UINT"和"+"未提供有效的预处理令牌
- 任务计划程序库的预处理不起作用 - 多定义错误
- Eclipse 问题 - 编译期间不考虑 .c 和 .cpp 文件中定义的预处理
- 使用python预处理后,C++(opencv)中的垫子类型数据与image_to_array相同
- Howo 使用 cl 预处理为 masm 组装生成一个单独的文件
- 我有一个预处理的 C/C++ 源文件 (cacti.i).如何从这个 .i 文件生成可执行二进制文件,以便我可以像 ./
- 如何使用Visual Studio C/C++编译器(cl.exe)来预处理我的objective-C代码
- 是具有预处理前分支实现的结构违反ODR
- 与不完整的Cholesky预处理的共轭梯度返回特征库的意外错误
- Visual Studio C - 无法输出预处理文件
- 在海湾合作委员会中加快宏观预处理的任何方法
- Xmllint未设置,而在路径中找不到XMLLINT;跳过XML预处理
- 如何在预处理时读取文件