#include <stdio.h>
#define foo(x, y) #x #y
int main()
{
printf("%s\n", foo(k, l));
return 0;
}
输出:
kl
我知道##会连接。从输出看来,#
似乎也进行了连接。
我对么?
如果我是正确的,那么##
运算符和#
运算符之间有什么区别?
答案 0 :(得分:2)
#
字符串化参数。见http://www.cs.utah.edu/dept/old/texinfo/cpp/cpp.html#SEC15
##
连接字符串。见http://www.cs.utah.edu/dept/old/texinfo/cpp/cpp.html#SEC16
答案 1 :(得分:1)
#
将参数转换为字符串。因此foo(k, l)
变为"k" "l"
,这与"kl"
相同,因为在C中,多个直接相邻的字符串文字被视为单个字符串文字。
如果#
进行了连接,则您的printf调用将变为printf("%s\n", kl);
,这会产生关于kl
未定义的错误。
答案 2 :(得分:1)
##
将两个参数#
引用(“Stringification”)连接起来。所以编译器会看到:
printf("%s\n", "k" "l");
如果您使用GCC,请使用-E
查看预处理器的输出。
此问题包含有关字符串文字串联的详细信息:Implementation of string literal concatenation in C and C++