C预处理器扩展顺序

时间:2015-11-20 14:16:59

标签: c gcc c-preprocessor

我正在尝试使用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扩展为止?

2 个答案:

答案 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的过程中会扩展其内容。

Demo.