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

时间:2017-10-22 16:02:31

标签: 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'
}

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

1 个答案:

答案 0 :(得分:1)

如果您使用-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已经存在。