我正在尝试使用 C 预处理器做一些事情。我有这个宏:
#define _MAX(x, y) (((x)) > ((y))) ? (x) : (y))
#define MAX1 _MAX(1,
#define MAX2 _MAX(2,0))
#define RIGHT _MAX(1,_MAX(2,0))
#define WRONG MAX1 MAX2
在这种情况下,RIGHT
给出了正确的表达式,但是 WRONG
将宏扩展为空白,即使它是相同的。
在我看来,这是因为在将 MAX1
扩展为 _MAX(1,
后,它检测到有一个 _MAX
宏需要扩展并尝试在不展开 MAX2
的情况下执行此操作,它具有语句的另一半。
如果我是对的,有什么方法可以延迟 _MAX
宏展开,直到 MAX2
展开?
最佳答案
这是正确的,因为 WRONG
的顺序正在展开。首先它将宏扩展为
MAX1 MAX2
然后它重新扫描它以进一步扩展它,首先它将 MAX1
扩展为 _MAX(1,
并且在重新扫描它时发生错误,因为它没有找到参数列表的终止。
如果您将 WRONG
定义为 MAX1 MAX2 )
,它会毫无怨言地展开它(但当然不会进行相同的展开)。
关于C预处理器展开顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33828907/