如何控制C宏的优先级 #定义VAL1CHK 20 #定义NUM 1 #定义联接(A,B,C)A##B#C int x=连接(VAL、NUM、CHK);

如何控制C宏的优先级 #定义VAL1CHK 20 #定义NUM 1 #定义联接(A,B,C)A##B#C int x=连接(VAL、NUM、CHK);,c,macros,C,Macros,有了上面的代码,我的期望是 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

有了上面的代码,我的期望是

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);

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

这与通过重新排序语法分析器生成器的语法规则来实现优先级非常相似。