define body 是另一个define

Define body is another define

我找不到明确的答案,似乎在实践中有效:

// example #1
#define test 5
#define test2 test

(test2 == 5) == true

甚至这个:

// example #2
#define test2 test
#define test 5

是否有明确的 C 规范规则允许这样做。我认为预处理器非常简单,它只是 find/replace。但我想在 #define test2 test 的情况下,它知道 test 不是字符串,所以它可能是 define?所以预处理器只针对这种情况进行多次扫描?

我的主要问题是,为什么我的示例 #2 有效?

如何处理第一个:

#define test 5
#define test2 test
something with test
something with test2

#define test2 5
something with 5
something with test2

something with 5
something with 5

如何处理第二个:

#define test2 test
#define test 5
something with test
something with test2

#define test 5
something with test
something with test

something with 5
something with 5

预处理结果:

#define test2 test
#define test 5

test2
test

给出:

5
5

即使在 test2 之后定义了 test。预处理器按照以下指定重新扫描源:

(C99, 6.10.3.4 Rescanning and further replacement p1) "After all parameters in the replacement list have been substituted and # and ## processing has taken place, all placemarker preprocessing tokens are removed. The resulting preprocessing token sequence is then rescanned, along with all subsequent preprocessing tokens of the source file, for more macro names to replace."