C 令牌粘合宏的组成
我有这些宏C 令牌粘合宏的组成,c,c-preprocessor,C,C Preprocessor,我有这些宏 #define NEXT(of_) ((of_ ## _SUFFIX) + 1) #define AA_SUFFIX (1) #define BB_SUFFIX (NEXT(AA)) // expands to ((((1)) + 1)) #define CC_SUFFIX (NEXT(BB)) // expands to ((((NEXT(AA))) + 1)) !!! 我希望CC_后缀扩展到3,但它没有(见上文)。 在这种情况下,有没有办法让预处理器计算NEXT(AA) 根
#define NEXT(of_) ((of_ ## _SUFFIX) + 1)
#define AA_SUFFIX (1)
#define BB_SUFFIX (NEXT(AA)) // expands to ((((1)) + 1))
#define CC_SUFFIX (NEXT(BB)) // expands to ((((NEXT(AA))) + 1)) !!!
我希望CC_后缀扩展到3,但它没有(见上文)。
在这种情况下,有没有办法让预处理器计算NEXT(AA) 根据答案,预处理器“[…]递归地展开替换文本,以便出现其他宏(宏本身在这些递归调用中被阻止)。”
考虑到这一点,CC_后缀
的扩展结果是(((NEXT(AA)))+1))
,因为宏NEXT(of_u)
已经使用过一次。要确认这是原因,您可以创建一个新宏,该宏执行与下一个(of)相同的操作,并在BB_后缀
中使用它:
#define NEXT(of_) ((of_ ## _SUFFIX) + 1)
#define NEXT1(of_) ((of_ ## _SUFFIX) + 1)
#define AA_SUFFIX (1)
#define BB_SUFFIX (NEXT1(AA))
#define CC_SUFFIX (NEXT(BB))
int main(void){
BB_SUFFIX;
CC_SUFFIX;
}
运行gcc-E macros.c
时,输出为:
# 1 "/home/jfacorro/dev/macros-expand.c"
# 1 "<command-line>"
# 1 "/home/jfacorro/dev/macros-expand.c"
int main(void){
((((1)) + 1));
(((((((1)) + 1))) + 1));
}
产生输出:
int main(void){
1 + 1;
1 + 1 + 1;
}
int main(void){
1 + 1;
1 + 1 + 1;
}