关于宏定义
  • 板块学术版
  • 楼主Chenyichen0420
  • 当前回复4
  • 已保存回复4
  • 发布时间2025/1/25 10:16
  • 上次更新2025/1/25 14:54:36
查看原帖
关于宏定义
581015
Chenyichen0420楼主2025/1/25 10:16

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++ 语法规范?

2025/1/25 10:16
加载中...