#运算符在宏中做什么?

时间:2014-02-04 13:50:37

标签: c macros

#include <stdio.h>

#define foo(x, y) #x #y

int main()
{
    printf("%s\n", foo(k, l));
    return 0;
}

输出:
kl

我知道##会连接。从输出看来,#似乎也进行了连接。 我对么?

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

3 个答案:

答案 0 :(得分:2)

答案 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++