Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 令牌粘合宏的组成_C_C Preprocessor - Fatal编程技术网

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