我在网上找不到答案的简单问题。在可变参数宏中,如何找到参数的数量?如果有解决方案,我可以使用 boost 预处理器。
如果有影响,我会尝试将可变数量的宏参数转换为提升预处理器序列、列表或数组,以便进一步重新处理。
最佳答案
我通常使用这个宏来查找多个参数:
#define NUMARGS(...) (sizeof((int[]){__VA_ARGS__})/sizeof(int))
完整示例:
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
#define NUMARGS(...) (sizeof((int[]){__VA_ARGS__})/sizeof(int))
#define SUM(...) (sum(NUMARGS(__VA_ARGS__), __VA_ARGS__))
void sum(int numargs, ...);
int main(int argc, char *argv[]) {
SUM(1);
SUM(1, 2);
SUM(1, 2, 3);
SUM(1, 2, 3, 4);
return 1;
}
void sum(int numargs, ...) {
int total = 0;
va_list ap;
printf("sum() called with %d params:", numargs);
va_start(ap, numargs);
while (numargs--)
total += va_arg(ap, int);
va_end(ap);
printf(" %d\n", total);
return;
}
它是完全有效的 C99 代码。但是它有一个缺点——你不能在没有参数的情况下调用宏 SUM()
,但是 GCC 有一个解决方案——参见 here .
所以在 GCC 的情况下,您需要像这样定义宏:
#define NUMARGS(...) (sizeof((int[]){0, ##__VA_ARGS__})/sizeof(int)-1)
#define SUM(...) sum(NUMARGS(__VA_ARGS__), ##__VA_ARGS__)
即使参数列表为空,它也能正常工作
关于C++ 预处理器 __VA_ARGS__ 参数数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2124339/