- 宏函数类似于函数,包含函数名、参数和实现,与函数定义差别不大(没有返回值和大括号)
- 可视情况决定函数结尾是否添加分号
1 | // 定义一个宏函数,实现三数相加 |
- 也可以将宏函数的参数作为函数名或类名使用
1 |
|
- 甚至可以将宏函数的参数作为宏名使用
1 | // 先定义一个宏 |
- 是的,宏函数也可以接受数量可变的参数:只需要配合使用
...
和__VA_ARGS__
即可
1 | // 定义宏 |
- 可变参数可以放在固定参数后面
1 | // 定义宏 |
- 特殊符号:
#
,字符串化#abc
会被翻译为"abc"
1 | // 定义宏 |
- 特殊符号:
##
,token粘贴(标记粘贴)A##B
会被转换为AB
,此后AB
可以作为其他宏名/变量名等进行替换
1 |
|
__VA_ARGS__
也支持特殊符号,即#__VA_ARGS__
和##__VA_ARGS__
- 宏与其定义顺序无关;但为保证可读性,还是建议位于文件上方的宏不要依赖文件下方的宏
- 宏函数无需写到一行内,复杂的宏可以通过
\
分割为多行- 注意:
\
必须是行内的最后一个字符,即使是后面多了一个空格也不行 - 注意:给多行的宏函数内添加注释只能使用
/* */
- 注意:
1 |