请考虑以下代码片段,
#include<stdio.h>
#define AB "HELLO"
#define A "WORLD"
#define MAC1 A##B
void main(void)
{
printf(MAC1"\n");
}
编译和执行时打印 HELLO。
请帮助理解为什么 A
和 B
之间忽略了 ##
。
同样当下面的代码被编译时,给出如下错误,
#include<stdio.h>
#define AB "HELLO"
#define A "WORLD"
#define MAC2 A#B
void main(void)
{
printf(MAC2"\n");
}
21.c: In function âmainâ:
21.c:11:2: error: stray â#â in program
21.c:11:9: error: expected â)â before string constant
为什么会出现这种行为?
最佳答案
##
预处理 token 用于 token 粘贴。
在宏定义中,A##B
的作用是生成标记 AB
。所以 printf(MAC1"\n")
与 printf(AB"\n")
相同。
token 没有被“忽略”,它正在做它的工作。
在您的第二个示例中,A#B
只是字面上的意思 A#B
。 #
仅在类似函数的宏中具有特殊含义。所以你的代码扩展为:
printf(A#B"\n");
这是一个错误,因为 #
不是预处理器之外的 C 语法的一部分。
关于c - 了解 token 粘贴,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31578714/