避免";ISO C99要求使用rest参数;

避免";ISO C99要求使用rest参数;,c,gcc,c99,gcc-warning,variadic-macros,C,Gcc,C99,Gcc Warning,Variadic Macros,使用GCC4.6.3(使用-ansi-pedantic),我得到了以下代码: // Argument counting macro #define NARGS(...) NARGS_(__VA_ARGS__, 5, 4, 3, 2, 1) #define NARGS_(_1, _2, _3, _4, _5, _, ...) _ static inline void fi_init_(size_t nargs, fileinfo_t *finfo, ...) { // Default f

使用GCC4.6.3(使用-ansi-pedantic),我得到了以下代码:

// Argument counting macro
#define NARGS(...) NARGS_(__VA_ARGS__, 5, 4, 3, 2, 1)
#define NARGS_(_1, _2, _3, _4, _5, _, ...) _

static inline void fi_init_(size_t nargs, fileinfo_t *finfo, ...) {
    // Default fmt/type values
    char* fmt  = "CD";
    int   type = 1000;

    if (nargs == 2) {
        va_list  ap;
        va_start(ap, hdr);
        fmt  = va_arg(ap, char*);
        type = va_arg(ap, int);
        va_end(ap);
    } 

    // Do some junk with it
}

#define fi_init(...) fi_init_(NARGS(__VA_ARGS__)-1, __VA_ARGS__)
当被称为:

fileinfo_t out; fi_init(&out);
fileinfo_t out; fi_init(&out, "CF", 2222);
我得到一个警告:

警告:ISO C99要求使用rest参数

当被称为:

fileinfo_t out; fi_init(&out);
fileinfo_t out; fi_init(&out, "CF", 2222);

我不知道。我怎样才能抑制这种情绪?

我想我的问题在于:

#define NARGS(...) NARGS_(__VA_ARGS__, 5, 4, 3, 2, 1)
#define NARGS_(_1, _2, _3, _4, _5, _, ...) _ 
将其更改为:

#define NARGS(...) NARGS_(__VA_ARGS__, 5, 4, 3, 2, 1, 0)
#define NARGS_(_1, _2, _3, _4, _5, _, ...) _ 

似乎已经解决了这个问题

我想我知道为什么会出现这些问题,但显然我不知道。如果可能的话,我想纠正我做错了什么。顺便说一句,这可能是我看到的问题的重复,但是我把我所有的论点都折叠成省略号,所以我不确定我是否看到了同样的东西。