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

标签 c++ c c-preprocessor variadic-macros

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

相关文章:

c++ - 严重错误:找不到 'boost/uuid/uuid.hpp'文件

c - 为什么我得到 -0 而不是 0?

c-preprocessor - 如何在#if 处触发关于 undefined symbol 的 C 预处理器错误? (LLVM/CLang/Xcode)

c++ - C++接口(interface)多重继承中的歧义

c++ - 忽略使用函数名称定义宏的参数

c - (10%2) 是什么意思?

c - 使用 C 预处理器有效地重命名变量

c-preprocessor - 覆盖 CPP 输出中的行标记文件名

c++ - 使用 C++ 风格与 C 风格编写 bmp-header

c - 加载原始二进制文件