宏替换指令概述
宏替换指令包括两种形式的 #define 指令:
- 通常用于定义一个常量
- 通过参数将宏定义为伪函数
此外,还有一个 #undef 指令用于撤消任何之前的 #define 定义。如果未使用 #undef,每个定义的宏在源代码编译结束之前都是有效的。
宏注册后即可在代码中按名称使用,并遵循标识符的规则。按照惯例,宏名称用大写字母书写。宏名称可以与变量、函数和其他源代码元素的名称重名。有目的地利用这一点可以动态地更改和生成源代码。然而,宏名称与程序元素的无意重名将导致错误。
两种形式的宏替换的操作原理是相同的。使用 #define 指令时,会引入一个标识符,该标识符与某段文本(即定义)相关联。如果预处理器后来在源代码中找到了给定的标识符,就会将该标识符替换为相关联的文本。我们强调,宏名称只有在注册后才能在编译的代码中使用(这类似于变量声明原则,但只适用于编译阶段)。
用宏的定义替换宏名称就称为扩展。对源代码的分析是逐步进行的,每次分析一行,但是每一行的扩展可以执行任意次,就像在循环中一样,前提是在结果中找到宏名称。不能在宏定义中包含相同的名称:替换时,这样的宏将导致“未知标识符”错误。
在本书的第三章,我们将学习 模板,它允许您使用不同规则生成(事实上就是复制)源代码。如果源代码中既有宏替换指令又有模板,则首先扩展宏,然后从模板生成代码。
宏名称在 MetaEditor 中以红色高亮显示。