我有一个名为“check”的宏,接受两个参数:
#define check(reg, n) ((reg >> n) & 1U)
我有以下这个参数列表:
#define TEST_ARGS 10, 1
代码:
check(TEST_ARGS);
扩展预期:
((10 >> 1) & 1U)
实际扩展:
((10, 1 >> ) & 1U)
我该如何为“check”宏定义多个参数以获取预期结果?谢谢。
我有一个名为“check”的宏,接受两个参数:
#define check(reg, n) ((reg >> n) & 1U)
我有以下这个参数列表:
#define TEST_ARGS 10, 1
代码:
check(TEST_ARGS);
扩展预期:
((10 >> 1) & 1U)
实际扩展:
((10, 1 >> ) & 1U)
#define CHECK(...) CHECK_(__VA_ARGS__)
#define CHECK_(reg, n) ((reg >> n) & 1U)
#define TEST_ARGS 10, 1
CHECK(TEST_ARGS)
测试:
$ $ gcc -x c -E - <<<'#define CHECK(...) CHECK_(__VA_ARGS__)
> #define CHECK_(reg, n) ((reg >> n) & 1U)
>
> #define TEST_ARGS 10, 1
> CHECK(TEST_ARGS)'
# 1 "<stdin>"
# 1 "<built-in>"
# 1 "<command-line>"
# 31 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 32 "<command-line>" 2
# 1 "<stdin>"
((10 >> 1) & 1U)
TEST_ARGS
作为check()
宏的第一个参数处理,然后在你的编译器上,某种方式将空参数插入为第二个参数。(我试了所有的编译器,如果缺少第二个参数,编译器将会生成错误)。
TEST_ARGS
在传递给 check()
之前进行扩展。
例如:
#define check2(...) check(__VA_ARGS__)
check2(TEST_ARGS)
。
#define V_(...) __VA_ARGS__
#define I_(M,...) V_(M(__VA_ARGS__))
#define check2(...) I_(check, __VA_ARGS__)
预处理器执行文本替换(实际上是替换标记)。因此,如果
#define check(reg, n) ((reg >> n) & 1U)
#define TEST_ARGS 10, 1
那么
check(TEST_ARGS);
被预处理为:
check(10, 1,);
第一个参数是完整的令牌10,1
,第二个参数为空