为什么以下最小例子不起作用?
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'
}
根据我的理解,宏中的宏应该可以工作,只要它们不是递归的。
答案 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
已经存在。