文本替换宏
来自cppreference.com
< cpp | preprocessor
预处理器支持文本宏替换。也支持函数式文本宏替换。
语法
#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 起)形参数量(不计