C 预处理器扩展顺序



我正在尝试使用 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的扩展过程中得到了扩展。

演示。

最新更新