#运算符在宏中做了什么?

#include  #define foo(x, y) #x #y int main() { printf("%s\n", foo(k, l)); return 0; } 

输出:
kl

我知道##会连接。 从输出看来#似乎也是连接。 我对么?

如果我是正确的那么##运算符和#运算符之间有什么区别?

#将参数转换为字符串。 因此foo(k, l)变为"k" "l" ,这与"kl"相同,因为在C中,直接彼此相邻的多个字符串文字被视为单个字符串文字。

如果#连接,你的printf调用将成为printf("%s\n", kl); 这将产生关于kl未被定义的错误。

# 字符串化参数。 见http://www.cs.utah.edu/dept/old/texinfo/cpp/cpp.html#SEC15

## 连接字符串。 见http://www.cs.utah.edu/dept/old/texinfo/cpp/cpp.html#SEC16

##连接两个参数, # quotes(“Stringification”)它们。 所以编译器会看到:

 printf("%s\n", "k" "l"); 

如果使用GCC,请使用-E查看预处理器的输出。

此问题包含有关字符串文字串联的详细信息: 在C和C ++中实现字符串文字串联