下面是一个简单的程序,它接受宏测试,将名称粘贴到令牌的末尾,并打印结果。

#define TEST 0
#define TEST_NAME "Joe"

#define ID_TO_NAME(id) id ## _NAME

int main(void) {
    printf("%s\n", ID_TO_NAME(TEST));
    return 0;
}

它工作得很好,但是如果我引入了一个间接级别,预处理器现在使用TEST的值而不是标记“TEST”,从而导致粘贴的标记是0_NAME而不是TEST_NAME。
#define TEST 0
#define TEST_NAME "Joe"

#define ID_TO_NAME(id) id ## _NAME

#define INDIRECTION(id) ID_TO_NAME(id)

int main(void) {
    printf("%s\n", INDIRECTION(TEST));
    return 0;
}

有没有办法让它像第一个示例一样工作(在展开宏之前粘贴标记),同时保持间接寻址?

最佳答案

您可以放弃使用“类对象”宏,并给TEST一个空参数列表。

#define TEST() 0

现在TEST将永远不会被替换,除非您主动在它后面放置()
您可以在传递令牌的每个宏中添加一个伪##运算符,而无需展开它然而,这也需要一个假的参数。
#define INDIRECTION(id,_) ID_TO_NAME(id##_)

    printf("%s\n", INDIRECTION(TEST,));

09-10 01:28
查看更多