C/C++ 预处理操作符:# 和 ##

  2022 年 02 月 21 日   C++  

一、字符串化:# 操作符

# 操作符的作用是将宏参数转换为字符串字面量,即使用双引号(")包裹住这个参数,例如:

#define STR(x) #x

调用 STR(something) 就会被替换为 "something"

参考链接:

二、连接参数:## 操作符

## 操作符的作用是将两个宏参数连接起来,例如:

#define CONCAT(a, b) a##b

调用 CONCAT(gcc, -11) 就会被替换为 gcc-11

参考链接:

三、注意事项

这两个操作符不会先展开其参数,而是直接使用传进来的实参,即使这个实参包含嵌套的宏。在 GCC 文档中关于 Argument Prescan 有这样的描述:

Macro arguments are completely macro-expanded before they are substituted into a macro body, unless they are stringified or pasted with other tokens.

具体可以参考我的另一篇文章:GCC 预处理:如何正确地将宏展开的结果转成字符串