gpt4 book ai didi

标记粘合宏的组成

转载 作者:太空宇宙 更新时间:2023-11-04 03:48:44 25 4
gpt4 key购买 nike

我得到了这些宏

#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_SUFFIX 扩展到 3,但它没有(见上文)。在这种情况下,有没有办法让预处理器计算 NEXT(AA)?

最佳答案

根据 this答案,预处理器 “[...] 递归地扩展其他宏出现的替换文本(宏本身在这些递归调用中被阻止。)”

考虑到这一点,CC_SUFFIX 的扩展最终成为 ((((NEXT(AA))) + 1)) 是有道理的,因为宏 NEXT(of_) 已经被使用过一次。要确认这是您可以创建一个与 NEXT(of_) 执行相同操作的新宏,并在 BB_SUFFIX 中使用它:

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

作为旁注,没有必要将宏的表达式括在括号中,如果你去掉它们,展开式会读起来更清晰。

#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){
1 + 1;
1 + 1 + 1;
}

关于标记粘合宏的组成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22355342/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com