如何控制C宏的优先级

How to control C Macro Precedence

#define VAL1CHK 20

#define NUM 1

#define JOIN(A,B,C) A##B##C

int x = JOIN(VAL,NUM,CHK);

对于上面的代码,我的期望是

int x = 20;

但是当宏扩展到

时出现编译错误
int x = VALNUMCHK; // Which is undefined

如何做到先替换NUM然后使用JOIN

您可以将 JOIN 操作重定向到另一个宏,然后执行实际粘贴,以强制扩展其参数:

#define VAL1CHK 20
#define NUM 1
#define JOIN1(A, B, C) A##B##C
#define JOIN(A, B, C) JOIN1(A, B, C)

int x = JOIN(VAL,NUM,CHK);

此技术通常与宏中的粘贴和字符串化运算符一起使用。