2010-07-31 10 views
6

Cosa significa questo avviso GCC?Cosa significa questo avvertimento del compilatore generato da `-pedantic`?

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

Le linee rilevanti sono:

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

L'ultima riga essere linea 232 all'interno di una funzione di implementazione. I flag del compilatore sono:

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

risposta

8

Sì, significa che è necessario passare almeno due argomenti nel modo in cui è stato definito. Si può solo fare

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

e poi si sarebbe anche evitare l'estensione del gcc , ## costrutto.

+1

Ciò mi ha lasciato perplesso per un po 'di tempo. In realtà il modo standard sarebbe 'log_debug ("% s "," Resetting bitmap ");'. – Dummy00001

+0

Strano che gli ellissi del preprocessore sostituiscano uno o più argomenti, tuttavia i ellissi C sostituiscono zero o più. Sto avendo qualche problema nell'estrarre questa semantica dallo standard C99. –

1

Significa che non si passa un secondo argomento a log_debug. Si aspetta uno o più argomenti per la parte ..., ma stai passando zero.

1

Ho un problema simile (anche se in C++) con la mia macro SNAP_LISTEN (...) come definito di seguito. L'unica soluzione che ho trovato è creare una nuova macro SNAP_LISTEN0 (...) che non includa il parametro args .... Non vedo un'altra soluzione nel mio caso. L'opzione della riga di comando -Wno-variadic-macros impedisce l'avviso variadic ma non quello 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)); 

Edit: versione del compilatore

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. 

Edit: comando avvertimenti linea

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

I -Wno-variadic-macro stessa opera da non ottengo un errore che dice che il variadic non è accettato Tuttavia, ho lo stesso errore di Matt Joiner:

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

Quale versione di GCC e quale revisione di C++ stai specificando durante la compilazione? –

+0

Ho fatto un aggiornamento alla mia risposta dato che utilizzo alcune opzioni di riga di comando -W. –