# 运算符
# (单号符号) 运算符将类似函数的宏的参数转换为字符串文字。 例如,如果使用以下伪指令定义宏 ABC : #define ABC(x) #x宏 ABC 的所有后续调用都将扩展为包含传递到 ABC的自变量的字符串文字。 例如:
| 调用 | 宏扩展的结果 |
|---|---|
ABC(1) |
"1" |
ABC(Hello there) |
"你好" |
不应将 # 运算符与 null 伪指令混淆。
根据以下规则在类似函数的宏定义中使用
# 运算符:- 类似函数的宏中
#运算符后面的参数将转换为包含传递到宏的自变量的字符串文字。 - 将删除在传递到宏的自变量之前或之后出现的空格字符。
- 嵌入在传递到宏的参数中的多个空格字符将替换为单个空格字符。
- 如果传递到宏的自变量包含字符串文字,并且文字中出现
\(反斜杠) 字符,那么在展开宏时,将在原始\之前插入第二个\字符。 - 如果传递到宏的自变量包含
"(双引号) 字符,那么展开宏时将在"之前插入\字符。 - 在对自变量进行宏扩展之前,会将该自变量转换为字符串字面值。
- 如果在宏定义的替换列表中出现多个
##运算符或#运算符,那么不会定义运算符的求值顺序。 - 如果宏扩展的结果不是有效的字符串文字,那么行为未定义。
以下示例演示了如何使用
# 操作程序: #define STR(x) #x
#define XSTR(x) STR(x)
#define ONE 1| 调用 | 宏扩展的结果 |
|---|---|
STR(\n "\n" '\n') |
"\n \"\\n\" '\\n'" |
STR(ONE) |
"一个" |
XSTR(ONE) |
"1" |
XSTR("hello") |
"\" hello \"" |