"## b"在C中的含义是什么?

nsa*_*yer 3 c

来自usbtiny/defs.h(ATTiny控制器的AVR libc USB代码):

#define CAT2(a,b)               CAT2EXP(a, b)
#define CAT2EXP(a,b)            a ## b
#define CAT3(a,b,c)             CAT3EXP(a, b, c)
#define CAT3EXP(a,b,c)          a ## b ## c
Run Code Online (Sandbox Code Playgroud)

什么是##运算符?我已经这样做了30年了,我很难过.谷歌没有帮助,因为我不认为他们正在索引这些字符.

abl*_*igh 8

##宏定义中的符号表示串联.

所以

#define concat(a,b) a ## b
Run Code Online (Sandbox Code Playgroud)

意思是

concat (pri, ntf) ("hello world\n");
Run Code Online (Sandbox Code Playgroud)

后处理到

printf("hello world\n");
Run Code Online (Sandbox Code Playgroud)

文档在这里.

同样有用的是stringify运算符(#),使用它不应该混淆.

一个测试:

/* test with
 *    gcc -E test.c
 * having removed the #include lines for easier to read output
 */

#include <stdio.h>
#include <stdlib.h>

#define concat(a,b) a ## b

int
main (int argc, char **argv)
{
  concat (pri, ntf) ("Hello world\n");
  exit (0);
}
Run Code Online (Sandbox Code Playgroud)

为什么额外的间接水平?正如Deduplicator在评论中指出他的答案如下,没有它,它将连接指定的字面术语,而不是宏替换术语.这种陷阱的一个有用的名单是在这里.

  • 换句话说,它是一种用子标记构建标记的方法. (2认同)