c - 防止间接级别内的宏扩展

标签 c concatenation c-preprocessor token

下面是一个简单的程序,它接受宏 TEST,将 _NAME 粘贴到标记的末尾,然后打印结果。

#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;
}

有没有办法让它像第一个例子一样运行(在扩展宏之前粘贴 token )同时保持间接?

最佳答案

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

#define TEST() 0

现在 TEST 将永远不会被替换,除非你主动在它后面加上 ()


您可以向每个传递 token 而不扩展 token 的宏添加伪造的 ## 运算符。然而,这也需要一个伪造的参数。

#define INDIRECTION(id,_) ID_TO_NAME(id##_)

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

关于c - 防止间接级别内的宏扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41734338/

上一篇:C - 高阶函数

下一篇:C代码优化查询

相关文章:

c - C中文件获取内容

sql - 将两个数据库列连接成一个结果集列

c - C 中无需库的字符串连接

c++ - 函数调用中参数前的双哈希

c - 无法将后续压缩数据写入 C 中的输出文件

c - ncursesw 函数未声明

c - va_arg 不适用于 double

c - 在C中的字符串中为每个单词的结尾添加空格

c++ - 避免双重包含 : Preprocessor directive vs. makefile

c++ - 我可以在 #define 函数中使用 Visual Studio 调试器吗?