Что означает это предупреждение компилятора, сгенерированное `-pedantic`? - PullRequest
6 голосов
/ 31 июля 2010

Что означает это предупреждение GCC?

cpfs.c:232:33: warning: ISO C99 requires rest arguments to be used

Соответствующие строки:

__attribute__((format(printf, 2, 3)))
static void cpfs_log(log_t level, char const *fmt, ...);

#define log_debug(fmt, ...) cpfs_log(DEBUG, fmt, ##__VA_ARGS__)

log_debug("Resetting bitmap");

Последняя строка - это строка 232 внутри реализации функции.Флаги компилятора:

-g -Wall -std=gnu99 -Wfloat-equal -Wuninitialized -Winit-self -pedantic

Ответы [ 3 ]

8 голосов
/ 31 июля 2010

Да, это означает, что вам нужно передать как минимум два аргумента так, как вы его определили. Вы могли бы просто сделать

#define log_debug(...) cpfs_log(DEBUG, __VA_ARGS__)

и тогда вы также избежите расширения gcc конструкции , ##.

1 голос
/ 14 октября 2012

У меня похожая проблема (хотя в C ++) с моим макросом SNAP_LISTEN (...), как определено ниже.Единственное решение, которое я нашел, - это создать новый макрос SNAP_LISTEN0 (...), который не включает параметр args ....Я не вижу другого решения в моем случае.Параметр командной строки -Wno-variadic-macros предотвращает предупреждение о вариациях, но не предупреждение ISO C99!

#define SNAP_LISTEN(name, emitter_name, emitter_class, signal, args...) \
    if(::snap::plugins::exists(emitter_name)) \
        emitter_class::instance()->signal_listen_##signal( \
            boost::bind(&name::on_##signal, this, ##args));

#define SNAP_LISTEN0(name, emitter_name, emitter_class, signal) \
    if(::snap::plugins::exists(emitter_name)) \
        emitter_class::instance()->signal_listen_##signal( \
            boost::bind(&name::on_##signal, this));

Редактировать: версия компилятора

g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Редактировать: предупреждения командной строки

set(CMAKE_CXX_FLAGS "-Werror -Wall -Wextra -pedantic -std=c++0x
  -Wcast-align -Wcast-qual -Wctor-dtor-privacy -Wdisabled-optimization
  -Wformat=2 -Winit-self -Wlogical-op -Wmissing-include-dirs -Wnoexcept
  -Wold-style-cast -Woverloaded-virtual -Wredundant-decls -Wshadow
  -Wsign-promo -Wstrict-null-sentinel -Wstrict-overflow=5 -Wswitch-default
  -Wundef -Wno-unused -Wno-variadic-macros -Wno-parentheses
  -fdiagnostics-show-option")

Сам макрос -Wno-variadic-macros работает, поскольку я не получаю сообщение об ошибке, утверждающее, что variadic не принят.Тем не менее, я получаю ту же ошибку, что и Мэтт Джойнер:

cpfs.c:232:33: warning: ISO C99 requires rest arguments to be used
1 голос
/ 31 июля 2010

Это означает, что вы не передаете второй аргумент log_debug. Он ожидает один или несколько аргументов для части ..., но вы передаете ноль.

...