ありがとう。ついでにもうひとつだけ、
int a = 1;
#define a b
#define b a
printf("%d", b);
では、これは?

ちなみに、
#define a b
#define a a
だったらaが再定義されているというエラーが出る。
だから#define b a → #define a a に展開されているとしたら、
aが再定義されているとエラーが出るはず。

もし左側の字句は展開されないのだったら、
上から順に展開されると b→a
で問題無く終わりのはずなんだが。

実際はbが定義されていないと出た。この場合どういう展開したかわかる?