我正在尝试使用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
扩展为止?
答案 0 :(得分:2)
这是正确的,因为订单WRONG
正在扩展。首先,它将宏扩展为
MAX1 MAX2
然后重新扫描以进一步扩展它,首先它将MAX1
扩展为_MAX(1,
并且在重新扫描时发生错误,因为它没有找到终止参数列表。
如果您已将WRONG
定义为MAX1 MAX2 )
,则会在没有投诉的情况下对其进行扩展(但当然不会进行相同的扩展)。
答案 1 :(得分:2)
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
的过程中会扩展其内容。