2010-07-31 13 views
6

Was bedeutet diese GCC-Warnung?Was bedeutet diese Compiler-Warnung, die von `-pedantic` generiert wird?

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

Die relevanten Linien sind:

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

Das Wesen Leitung 232 letzte Zeile in einer Funktion Implementierung. Die Compiler-Flags sind:

Antwort

8

Ja, es bedeutet, dass Sie mindestens zwei Argumente auf die Art und Weise übergeben müssen, wie Sie es definiert haben. Sie könnten nur

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

tun und dann würden Sie auch die gcc Erweiterung des , ## Konstrukt vermeiden.

+1

Das hat mich schon eine ganze Weile verwirrt. Eigentlich wäre der normale Weg 'log_debug ("% s "," Bitmap zurücksetzen ");'. – Dummy00001

+0

Wie seltsam, dass die Präprozessor-Ellipse ein oder mehrere Argumente ersetzt, aber die C-Ellipse ersetzt null oder mehr. Ich habe Probleme, diese Semantik aus dem C99-Standard zu extrahieren. –

1

Es bedeutet, dass Sie kein zweites Argument an log_debug übergeben. Es erwartet ein oder mehrere Argumente für den ... Teil, aber Sie überschreiten Null.

1

Ich habe ein ähnliches Problem (obwohl in C++) mit meinem Makro SNAP_LISTEN (...) wie unten definiert. Die einzige Lösung, die ich gefunden habe, ist das Erstellen eines neuen Makros SNAP_LISTEN0 (...), das den Parameter args ... nicht enthält. Ich sehe in meinem Fall keine andere Lösung. Die Befehlszeilenoption -WNO-variadic-macros verhindert die variadic Warnung, aber nicht die 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: Compiler-Version

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: Warnungen Befehlszeile

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

Das -Wno-variadische-Makros selbst, da ich funktioniert sagen, nicht einen Fehler, dass die variadische wird nicht akzeptiert. Allerdings bekomme ich den gleichen Fehler wie bei Matt Joiner:

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

Welche Version von GCC und welche C++ - Revision geben Sie während der Kompilierung an? –

+0

Ich habe meine Antwort aktualisiert, da ich einige Befehlszeilenoptionen verwende. –