gpt4 book ai didi

c - 嵌套宏和##

转载 作者:行者123 更新时间:2023-12-02 03:12:46 25 4
gpt4 key购买 nike

来自 KRC 的 C 程序设计语言

After

#define cat(x, y)       x ## y 

the call cat(var, 123) yields var123. However, the call cat(cat(1,2),3) is undefined: the presence of ## prevents the arguments of the outer call from being expanded. Thus it produces the token string cat ( 1 , 2 )3 and )3 (the catenation of the last token of the first argument with the first token of the second) is not a legal token.

If a second level of macro definition is introduced,

#define xcat(x, y)      cat(x,y)   

things work more smoothly; xcat(xcat(1, 2), 3) does produce 123, because the expansion of xcat itself does not involve the ## operator.

## 的属性是什么使这两个示例有所不同?

为什么第一个例子里面的cat(1,2)没有展开,而第二个例子里面的xcat(1,2)展开了?

谢谢!

最佳答案

## 运算符的(不太为人所知的)特征之一是它禁止进一步扩展其参数(它只将它们视为纯字符串)。 gcc 预处理器文档的摘录:

...As with stringification, the actual argument is not macro-expanded first...

也就是说,## 的参数展开。

通过使用您的 xcat 宏实现额外的间接寻址,您正在解决这个问题(称为 argument prescan 的过程正在跳入并实际评估结果字符串两次)

关于c - 嵌套宏和##,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38975200/

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