[英]C preprocessor expansion order
我正在尝试使用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
情况下执行该操作, MAX2
具有语句的另一半。
如果我是对的,有什么办法可以将_MAX
宏扩展延迟到MAX2
扩展之前?
是正确的,因为WRONG
的顺序正在扩展。 首先,它将宏扩展为
MAX1 MAX2
然后它重新扫描以进一步扩展它,首先将MAX1
扩展为_MAX(1,
并且是在重新扫描此错误时发生,因为它找不到参数列表的终止。
如果您将WRONG
定义为MAX1 MAX2 )
,它将毫无疑问地进行扩展(但当然不会进行相同的扩展)。
每次扩展后,C预处理程序都会扫描宏。 第6.10.3.4节规定:
在替换列表中的所有参数都已被替换并且
#
和##
处理已经完成之后,所有地标预处理标记都将被删除。 然后,将重新扫描所得的预处理令牌序列以及源文件的所有后续预处理令牌,以替换更多的宏名称。
强制C预处理程序在宏A之前扩展宏B的一种方法是将B作为参数传递给A:
#define _MAX(x, y) (((x)>(y))?(x):(y))
#define MAX1(Y) _MAX(1,Y)
#define MAX2 _MAX(2,0)
#define NEW_RIGHT MAX1(MAX2)
现在, MAX2
成为MAX1
的参数,因此在扩展MAX1
的过程中扩展了它的内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.