gpt4 book ai didi

C++ 预处理器 __VA_ARGS__ 参数数量

转载 作者:IT老高 更新时间:2023-10-28 11:59:40 26 4
gpt4 key购买 nike

我在网上找不到答案的简单问题。在可变参数宏中,如何找到参数的数量?如果有解决方案,我可以使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com