宏 (C/C++)
预处理器在除预处理器指令之外的所有行中扩展宏,这些行使用 # 作为第一个非空格字符。 它在一些指令的各部分展开宏,这些指令在条件编译过程中没有跳过。 条件编译指令可以禁止编译源文件的各个部分。 它们会测试常数表达式或标识符,以确定要传递给编译器的文本块,以及预处理过程中要从源文件中移除的文本块。
#define
指令通常用于将有用标识符与常量、关键字和常用语句或表达式关联。 表示常数的标识符有时称为“符号常数”或“清单常数”。 表示语句或表达式的标识符称为“宏”。 在该预处理器文档中,仅使用术语“宏”。
在程序源文本或某些其他预处理器命令的自变量中识别宏的名称时,它将被视为对该宏的调用。 宏名称将替换为宏主体的副本。 如果宏接受自变量,则宏名称后面的实际自变量将替换为宏主体内的形式参数。 将宏调用替换为已处理的主体副本的过程称为宏调用的“扩展”。
实际上,有两种类型的宏。 “类似于对象”的宏不采用任何自变量。 “类似于函数”的宏可以定义为接受自变量,以便其外观和行为类似于函数调用。 由于宏不生成实际函数调用,因此你有时可以将函数调用替换为宏以使程序更快地运行。 (在 C++ 中,内联函数通常是首选方法。)但是,如果未定义和小心使用宏,宏会导致出现问题。 必须在带有自变量的宏定义中使用括号,以便在表达式中保持适当的优先级。 此外,宏无法正确处理具有副作用的表达式。 有关详细信息,请参阅 #define 指令中的 getrandom
示例。
一旦定义了宏,就无法在未先移除原始定义的情况下将其重定义为不同的值。 但是,您可以使用完全相同的定义来重定义宏。 因此,相同的定义可能会在一个程序中出现多次。
#undef
指令将移除宏的定义。 一旦移除了定义,就可以将宏重定义为不同的值。 #define 指令和 #undef 指令分别讨论了 #define
和 #undef
指令。
有关详细信息,请参阅