C 中的 # 和 ## 宏

use*_*165 2 c macros

方案一:

#include <stdio.h>
#define foo(x, y) #x #y

int main()
{
  printf("%s\n", foo(k, l)); //prints kl
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

方案2:

#include <stdio.h>
#define foo(m, n) m ## n

int main()
{
  printf("%s\n", foo(k, l)); //compiler error
}
Run Code Online (Sandbox Code Playgroud)

为什么两个程序的输出会有如此大的差异?这两个程序之间的确切区别是什么?

Kei*_*son 5

#是“字符串化”运算符;它将其参数转换为字符串文字。

##是“标记粘贴”运算符;它将两个参数连接成一个标记,不一定是字符串文字。

一个例子:

#include <stdio.h>

#define foo(m, n) m ## n

int main(void) {
    char *kl = "token pasting";
    printf("%s\n", foo(k, l));
}
Run Code Online (Sandbox Code Playgroud)

打印:

token pasting
Run Code Online (Sandbox Code Playgroud)