【发布时间】:2011-07-06 10:41:47
【问题描述】:
C99 standard document 在与## 预处理运算符相关的部分中有以下示例:
在以下片段中:
#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 产生一个新的令牌,包括 两个相邻的尖锐标志,但这个新的 token 不是 ## 运算符。
我不明白为什么 hash_hash 的替换会产生 ## 而不是“##”或“#”“#”。双散列前后单散列的作用是什么?
非常感谢任何回复。
【问题讨论】:
-
## 前后的单个哈希只是字符,而##(令牌)会将它们变成两个字符##(而不是令牌)。在对它们应用 mkstr 后,它们将被转换为 "##" 的字符串
标签: c concatenation c-preprocessor