c - 了解 token 粘贴

标签 c c-preprocessor

请考虑以下代码片段,

#include<stdio.h>
#define AB "HELLO"
#define A "WORLD"
#define MAC1 A##B
void main(void)
{
    printf(MAC1"\n");
}

编译和执行时打印 HELLO。 请帮助理解为什么 AB 之间忽略了 ##

同样当下面的代码被编译时,给出如下错误,

#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/

相关文章:

c++ - 在 main() 中调用函数变量后访问函数变量

c - 使用 fork 系统调用

c++ - 为什么预处理器宏是邪恶的,有哪些替代方案?

C 预处理器宏替换#if#else 语句

编译的枚举常量

c - 使用 C scanf_s 输入字符串

c++ - pthread_exit(NULL);不工作

c - 拆分/解析并从 char 数组中获取值

c++ - #pragma warning 不抑制警告

c# - #DEBUG ASPX 页面中的预处理器语句