c++ 中的宏定义有很多的用法,包括这样一条:
##运算符可以用于类函数宏的替换部分。另外,##还可以用于类对象宏的替换部分。这个运算符把两个语言符号组合成单个语言符号。
例如:
#include <stdio.h> #define XNAME(n) x##n #define PXN(n) printf("x"#n" = %d\n",x##n) int main(void) { int XNAME(1)=12;//int x1=12; PXN(1);//printf("x1 = %d\n", x1); //输出:x1=12 return 0; }
(转自 https://blog.csdn.net/u012611878/article/details/52534622)
于是我在代码中这么写:
constexpr int md = 1e9 + 7;
inline int inc(int l, const int r) { return (l += r) >= md && (l -= md), l; }
struct seg_tree{
struct node {
int l1, l2, v1, v2, mx1, mx2, mi1, mi2, mi, mx, l, r;
}re[1000005 << 2];
inline void pup(int p) {
#define psup(val) re[p].##val = inc(re[p << 1].##val, re[p << 1 | 1].##val)
psup(v1); psup(mx1); psup(mi1);
psup(v2); psup(mx2); psup(mi2);
}
//后面省略,没有报错
}
洛谷报错:
/tmp/compiler_tvqdm7_g/src:16:24: 错误:毗连“.”和“v1”不能给出一个有效的预处理标识符
Devcpp(TDM-GCC4.9.2)报错:
[Error] pasting "." and "v1" does not give a valid preprocessing token
但是 Visual Studio 2022 中采用 ISO C++14 标准可以正常过编。
求这种写法到底符不符合 c++ 语法规范?