问题
下述头文件中的代码,是否可编译通过:
#define PCBA_SELECT PCBA_48PIN
#define PCBA_32PIN 1
#define PCBA_48PIN 2
#define PCBA_64PIN 3
我们都知道,C 语言变量需要先定义后使用,但是宏定义呢,是否也是必须要首先定义?
先说结论
上述代码没有问题,头文件中(或多个头文件之间)宏定义的相互引用不需要遵循先后顺序。
注意:这里说的是头文件中的宏定义间的相互引用,而不是头文件宏定义和 C 代码中的实际使用,在代码中实际使用时,宏定义是必须在使用前进行定义。
探究
在 C 语言中,宏是预处理指令,在预处理阶段,宏的替换文本在定义时并不会立即展开,而是等到宏在源文件中被实际使用时才进行展开。 简而言之:
- 宏的替换在定义时不求值,只是保存文本;
- 使用宏时会进行一次或多次的递归扫描,直到所有可展开的宏都被替换完;
- 只要在源文件中使用点之前已经出现了所有涉及的宏定义(不论顺序),展开过程就能成功。







