c - 宏作为宏参数扩展不起作用

标签 c c-preprocessor

为什么下面的最小示例不起作用?

static inline int test_1(int x) { return x; }
#define TEST(a, ...) test_##a(__VA_ARGS__)
#define ONE 1
void temp() {
    TEST(1, 5); // OK
    TEST(ONE, 5); // error: use of undeclared identifier 'test_ONE'
}

根据我的理解,宏中的宏应该可以工作,只要它们不是递归的。

最佳答案

如果您使用-E 选项,您可以看到what your code looks like在预处理器阶段之后。

宏在多个过程中展开,并有自己的优先顺序。

在这种情况下,TEST(ONE,5) 直接扩展为 test_ONE(5)

如果您添加一个间接层 ( or more ),您可以导致 ONE 在看到 ## 运算符之前展开。

#define TEST_I(a,...)test_##a(__VA_ARGS__)
#define TEST(a, ...) TEST_I(a,__VA_ARGS__)

在第一遍 TEST(ONE,5) 被扩展为 TEST_I(ONE,5) 然后是 TEST_I(1,5),在第二次传递时,它变成了 test_1(5)

虽然 TEST_I 没有在第一遍展开,因为它是由 TEST 的展开生成的,而 ONE 已经存在.

关于c - 宏作为宏参数扩展不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46876204/

相关文章:

在 GEdit 中创建自己的语法突出显示?

c - gdb:仅当调用函数不等于某个值时才会有条件地中断函数

我可以用 C 编译选定的 header 代码吗

c++ - 标记粘贴运算符 (##) 正在占用我的 C++ 宏中的空格

c - 如何进行这个初始化?

我可以将 memcmp 与 qsort 一起使用吗?

c - 在这个简单的例子中,为什么我没有从 gcc 收到 "used uninitialized"警告?

ios - 如何为自定义结构编写类似于 CGRectZero 的宏

c++ - C 与 C++ 为什么这个宏不扩展为常量?

c++ - 预处理器指令 #if 和非类型模板参数