# 运算符

# (单号符号) 运算符将类似函数的宏的参数转换为字符串文字。 例如,如果使用以下伪指令定义宏 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 \""