#运算符在宏中做了什么?
#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 ++中实现字符串文字串联