文本替换宏

来自cppreference.com


 
 
C++ 语言
 
 

预处理器支持文本宏替换。也支持函数式文本宏替换。

语法

#define 标识符 替换列表 (可选) (1)
#define 标识符 (形参 ) 替换列表 (可选) (2)
#define 标识符 (形参 , ...) 替换列表 (可选) (3) (C++11 起)
#define 标识符 (...) 替换列表 (可选) (4) (C++11 起)
#undef 标识符 (5)

解释

#define 指令

#define 指令将标识符 定义为宏,即指示编译器以将在它之后出现的所有标识符 都替换为替换列表,而它也可以被进一步处理。如果该标识符已被定义为任何类型的宏,那么除非这些定义都相同,否则程序非良构。

如果标识符 已被另一个 #defined 指令定义为宏,那么除非这些定义都相同,否则程序非良构。

如果标识符 是一个预定义宏名(见下文)或标识符 defined,那么行为未定义(C++26 前)程序非良构(C++26 起)

对象式宏

对象式宏以替换列表 替换每次出现的被定义标识符#define 指令的版本 (1) 准确表现如此。

函数式宏

函数式宏以替换列表 替换每次出现的被定义标识符,可选地接受一定量的以逗号分隔的实参,它们随即替换掉替换列表 中出现的任何对应的形参。如果实参中存在预处理指令,那么行为未定义(C++26 前)程序非良构(C++26 起)

函数式宏语法类似函数调用语法:每个宏名实例后随一个 ( 作为下个预处理记号,所引入的预处理记号序列将被替换为替换列表。该序列以匹配的 ) 预处理记号终止,跳过中间的匹配左右圆括号对。

对于版本 (2),实参数量必须与宏定义中的形参数量相同。对于版本 (3,4),实参数量必须多于(C++20 前)不少于(C++20 起)形参数量(不计