Frage

Zur Zeit bin ich die folgende Funktion Vorlage nicht verwendete Variable Warnungen zu unterdrücken:

template<typename T>
void
unused(T const &) {
  /* Do nothing. */
}

Wenn jedoch die Portierung von Linux auf Cygwin, ich bin jetzt Compiler-Fehler auf g bekommen ++ 3.4.4 (auf einem Linux Ich bin 3.4.6, also vielleicht ist dies ein Bug-Fix?):

Write.cpp: In member function `void* Write::initReadWrite()':
Write.cpp:516: error: invalid initialization of reference of type 'const volatile bool&' from expression of type 'volatile bool'
../../src/common/Assert.h:27: error: in passing argument 1 of `void unused(const T&) [with T = volatile bool]'
make[1]: *** [ARCH.cygwin/release/Write.o] Error 1

Das Argument für nicht verwendete ist Mitglied Variable deklariert als:

  volatile bool readWriteActivated;

Ist das ein Compiler Fehler oder ein Fehler in meinem Code?

Hier ist der minimale Testfall:

template<typename T>
void unused(T const &) { }

int main() {
  volatile bool x = false;
  unused(!x); // type of "!x" is bool
}
War es hilfreich?

Lösung 3

Es ist ein Compiler-Fehler und es gibt keinen bekannten Arbeitsarounds:

http://gcc.gnu.org/bugzilla/show_bug.cgi ? id = 42655

Es ist in v4.4 behoben.

Andere Tipps

Die tatsächliche Art und Weise Sie angibt, tatsächlich keinen Parameter verwenden, ist es nicht einen Namen geben:

int f(int a, float) {
     return a*2;
}

wird überall mit allen Warnungen kompilieren eingeschaltet, ohne Warnung über den nicht verwendeten Schwimmer. Selbst wenn das Argument einen Namen in dem Prototyp hat (z int f(int a, float f);), wird es noch nicht beschweren.

Ich bin nicht 100% sicher, dass dies tragbar, aber dies ist das Idiom ich in der Regel zur Unterdrückung von Warnungen über nicht verwendete Variablen verwendet habe. Der Kontext ist hier ein Signal-Handler, der nur zu fangen SIGINT und SIGTERM verwendet wird, so dass, wenn die Funktion überhaupt genannt wird ich, dass es Zeit für das Programm zu beenden wissen.

volatile bool app_killed = false;
int signal_handler(int signum)
{
    (void)signum; // this suppresses the warnings
    app_killed = true;
}

Ich neige dazu, die Parameterliste mit __attribute__((unused)) Abneigung bis unübersichtlich, da die Besetzung zu Leeren Trick funktioniert ohne für Visual C ++ Makros zurückzugreifen.

In GCC, können Sie einen Makro wie folgt definieren:

#ifdef UNUSED
#elif defined(__GNUC__)
# define UNUSED(x) UNUSED_ ## x __attribute__((unused))
#elif defined(__LCLINT__)
# define UNUSED(x) /*@unused@*/ x
#else
# define UNUSED(x) x
#endif 

Jeder mit diesem Makro markierten Parameter werden die ungenutzte Warnung GCC aussendet (und benennt die Parameter mit dem Präfix UNUSED_) unterdrücken. Für Visual Studio können Sie Warnungen mit einer #pragma Richtlinie unterdrücken.

Die Antwort von haavee vorgeschlagen (geändert durch die ur) ist derjenige, würde ich normalerweise verwenden:

int f(int a, float /*epsilon*/) {
     return a*2;
}

Das eigentliche Problem tritt auf, wenn das Argument manchmal , aber nicht immer in dem Verfahren verwendet wird, z.

int f(int a, float epsilon) {
#ifdef LOGGING_ENABLED
     LOG("f: a = %d, epsilon = %f\n", a, epsilon);
#endif
     return a*2;
}

Jetzt kann ich kommentieren Sie nicht den Parameternamen Epsilon denn das wird mein Logging Build brechen (ich will nicht eine andere #ifdef in der Argumentliste einfügen, weil das den Code sehr viel schwieriger macht zu lesen).

Also ich denke, die beste Lösung Tom Vorschlag nutzen würde:

int f(int a, float epsilon) {
(void) epsilon;    // suppress compiler warning for possibly unused arg
#ifdef LOGGING_ENABLED
     LOG("f: a = %d, epsilon = %f\n", a, epsilon);
#endif
     return a*2;
}

Meine einzige Sorge wäre, dass einige Compiler über die warnen könnte „(void) epsilon;“ Aussage, z.B. „Anweisung hat keine Auswirkung“ Warnung oder so - ich denke, ich werde nur zu Test haben auf allen Compilern ich wahrscheinlich ...

verwenden, bin
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top