我正在尝试使用 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 预处理器在每次扩展后扫描宏。第 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
的扩展过程中得到了扩展。
演示。