2010-07-31 11 views
6

¿Qué significa esta advertencia de GCC?¿Qué significa la advertencia del compilador generada por `-pedantic`?

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

Las líneas relevantes son:

__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"); 

La última línea línea de bienestar 232 dentro de una implementación de la función. Los indicadores del compilador son:

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

Respuesta

8

Sí, significa que debe pasar al menos dos argumentos de la manera que lo definió. Se podía hacer

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

y luego también se evitaría la extensión de la gcc , ## constructo.

+1

Eso me dejó perplejo durante bastante tiempo también. En realidad, la forma estándar sería 'log_debug ("% s "," Restablecer bitmap ");'. – Dummy00001

+0

Qué extraño que la elipsis del preprocesador sustituya a uno o más argumentos, pero la elipsis C sustituye a cero o más. Tengo problemas para extraer esta semántica del estándar C99. –

1

Significa que no está pasando un segundo argumento a log_debug. Espera uno o más argumentos para la parte ..., pero está pasando cero.

1

Tengo un problema similar (aunque en C++) con mi macro SNAP_LISTEN (...) como se define a continuación. La única solución que he encontrado es crear una nueva macro SNAP_LISTEN0 (...) que no incluya el parámetro args ... No veo otra solución en mi caso. La opción de línea de comando -Wno-variadic-macros evita la advertencia variadica pero no la 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)); 

Editar: versión del compilador

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. 

Editar: advertencias de línea de comandos

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") 

Los -Wno-variadic-macros en sí funciona ya que no obtiene un error diciendo que el variadic no es aceptado Sin embargo, me sale el mismo error que Matt Joiner:

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

¿Qué versión de GCC y qué revisión de C++ está especificando durante la compilación? –

+0

Hice una actualización de mi respuesta ya que utilizo algunas opciones de línea de comando -W. –

Cuestiones relacionadas