Во избежание "стандарт ISO С99 требует аргументов, остальные будут использованы"


С gcc 4.6.3 (with-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);

Я получаю предупреждение:

Предупреждение: ISO C99 требует использования аргументов rest

При вызове как:

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

Я не знаю. как я могу подавить это?

1 4

1 ответ:

Я думаю, что моя проблема была здесь:

#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, _, ...) _ 

Кажется, исправил его