#include <stdio.h>
#define PRINT(name) print ## name()
void printHE()
{
printf("Hello");
}
void printWO()
{
printf("World\n");
}
enum {
HE,
WO,
};
int main()
{
PRINT(HE);
PRINT(WO);
}
它完美无缺,但为什么呢?
##
中的#define
是什么意思?
为什么HE
没有转换为0
?
答案 0 :(得分:4)
鉴于你问的是##
我假设PRINT
被定义为
#define PRINT(X) print##X()
##
是一个令牌粘贴操作符,它将两个令牌连接到它的左侧和右侧,产生一个令牌。
当您编写PRINT(HE)
时,预处理器会将其转换为printHE()
,这是一个常规函数调用。
因为HE是枚举,所以他应该转换为0
这是一个非常好的问题!翻译不会发生,因为预处理器在解释enum
之前运行,因此HE
和WO
是enum
成员的事实不会改变任何内容。
答案 1 :(得分:0)
它是表达式中的转义序列。它连接最左边和最右边以生成令牌。
## 是令牌粘贴运算符
答案 2 :(得分:0)
在#define PRINT(name) print ## name
##
是token pasting operator,用于将标记“粘合”在一起
答案 3 :(得分:0)
在我的电脑上,它无法正常工作。打印错误如下:
two_sharp.c :(。text + 0x3a):对PRINT'
two_sharp.c:(.text+0x46): undefined reference to
PRINT'的未定义引用
collect2:ld返回1退出状态