这个诀窍是什么?

时间:2013-09-05 14:47:56

标签: c macros

#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

4 个答案:

答案 0 :(得分:4)

鉴于你问的是##我假设PRINT被定义为

#define PRINT(X) print##X()

##是一个令牌粘贴操作符,它将两个令牌连接到它的左侧和右侧,产生一个令牌。

当您编写PRINT(HE)时,预处理器会将其转换为printHE(),这是一个常规函数调用。

  

因为HE是枚举,所以他应该转换为0

这是一个非常好的问题!翻译不会发生,因为预处理器在解释enum之前运行,因此HEWOenum成员的事实不会改变任何内容。

答案 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退出状态