为什么下面的最小示例不起作用?
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/