C预处理器#和##运算符
C99标准文档在与##预处理运算符相关的部分中有以下示例:
在以下片段中:
#define hash_hash # ## # #define mkstr(a) # a #define in_between(a) mkstr(a) #define join(c, d) in_between(c hash_hash d) char p[] = join(x, y); // equivalent to // char p[] = "x ## y";
扩张在不同阶段产生:
join(x, y) in_between(x hash_hash y) in_between(x ## y) mkstr(x ## y) "x ## y"
换句话说,扩展hash_hash会产生一个新的令牌,由两个相邻的尖锐符号组成,但这个新令牌不是##运算符。
我不明白为什么hash_hash的替换产生##而不是“##”或“#”“#”。 在双哈希播放之前和之后单个哈希的角色是什么?
任何回复都非常感谢。
##
中的# ## #
就像这个表达式中的转义序列一样。 它连接最左边和最右边的#
,最终产生令牌##
。 简单地将宏定义为##
会导致错误,因为串联运算符需要两个操作数。