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

4 回答 4

4

鉴于你在问##我假设它PRINT被定义为

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

The##是一个标记粘贴操作符,它将左右两个标记连接在一起,产生一个标记。

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

因为他是一个枚举,他应该翻译成0

这是一个非常好的问题!翻译不会发生,因为预处理器在enums 被解释之前运行,所以HEandWOenum成员这一事实不会改变任何东西。

于 2013-09-05T14:52:16.440 回答
0

这是您表达式中的转义序列。它连接最左边和最右边以产生令牌。

##是令牌粘贴运算符

于 2013-09-05T14:53:01.310 回答
0

#define PRINT(name) print ## name

##令牌粘贴运算符,用于将令牌“粘合”在一起

于 2013-09-05T14:53:50.397 回答
0

在我的电脑上,它不能正常工作。打印错误如下:

two_sharp.c:(.text+0x3a): 未定义对PRINT' two_sharp.c:(.text+0x46): undefined reference toPRINT 的引用'collect2: ld 返回 1 退出状态

于 2013-09-05T14:55:03.087 回答