Ich habe eine plattformübergreifende Anwendung und in einigen meiner Funktionen werden nicht alle an Funktionen übergebenen Werte verwendet. Daher erhalte ich eine Warnung von GCC, dass es nicht verwendete Variablen gibt.
Was wäre der beste Weg, um die Warnung zu codieren?
Ein #ifdef um die Funktion?
#ifdef _MSC_VER
void ProcessOps::sendToExternalApp(QString sAppName, QString sImagePath, qreal qrLeft, qreal qrTop, qreal qrWidth, qreal qrHeight)
#else
void ProcessOps::sendToExternalApp(QString sAppName, QString sImagePath, qreal /*qrLeft*/, qreal /*qrTop*/, qreal /*qrWidth*/, qreal /*qrHeight*/)
#endif
{
Das ist so hässlich, scheint aber so, wie es der Compiler bevorzugen würde.
Oder weise ich der Variablen am Ende der Funktion Null zu? (was ich hasse, weil es etwas im Programmablauf ändert, um eine Compiler-Warnung zum Schweigen zu bringen).
Gibt es einen richtigen Weg?
c++
gcc
warnings
gcc-warning
Phil Hannent
quelle
quelle
Q_UNUSED
Makro hat. Überprüfen Sie es in der Dokumentation.Antworten:
Sie können es in den
(void)var;
Ausdruck " " setzen (tut nichts), damit ein Compiler sieht, dass es verwendet wird. Dies ist zwischen Compilern portierbar.Z.B
Oder,
quelle
Q_UNUSED
prinzipiell umgesetzt.#define UNUSED(expr) (void)(expr)
funktionieren (ohne das Do-While).template<typename... Args> void f(const Args&... args)
kann ich nicht schreiben(void)args;
oder(void)args...;
weil beide Syntaxfehler sind.In GCC und Clang können Sie die
__attribute__((unused))
Präprozessor-Direktive verwenden, um Ihr Ziel zu erreichen.Beispielsweise:
quelle
C ++ 17 stellt jetzt das
[[maybe_unused]]
Attribut bereit .http://en.cppreference.com/w/cpp/language/attributes
Ganz nett und normal.
quelle
Ihre aktuelle Lösung ist am besten - kommentieren Sie den Parameternamen aus, wenn Sie ihn nicht verwenden. Dies gilt für alle Compiler, sodass Sie den Vorprozessor nicht speziell für GCC verwenden müssen.
quelle
g++
davor warne). Was würden Sie in einem solchen Fall empfehlen?C ++ 17 Update
In C ++ 17 erhalten wir das Attribut [[vielleicht_unused]], das in [dcl.attr.unused] behandelt wird.
Für das folgende Beispiel:
Sowohl clang als auch gcc generieren eine Diagnose mit -Wall -Wextra für bar und unused_bool ( Live anzeigen ).
Beim Hinzufügen von [[vielleicht_unused]] wird die Diagnose stummgeschaltet :
sehe es live .
Vor C ++ 17
In C ++ 11 könnte eine alternative Form des
UNUSED
Makros unter Verwendung eines Lambda-Ausdrucks ( über Ben Deane ) mit einer Erfassung der nicht verwendeten Variablen gebildet werden:Der sofortige Aufruf des Lambda-Ausdrucks sollte anhand des folgenden Beispiels optimiert werden:
wir können in godbolt sehen, dass der Anruf weg optimiert ist:
quelle
template <class T> inline void NOTUSED( T const & result ) { static_cast<void>(result); }
Sie könnten auch ein Lambda in der Funktion verwenden, nehme ich an.[&x]{}()
bringt die Warnung nicht wirklich zum Schweigen, sondern leitet die Warnung stattdessen von der Anruferfunktion an das Lambda weiter. Es wird einige Zeit dauern, bis Compiler dies als Warnung erkennen, aber Clang-Tidy beschwert sich bereits über eine nicht verwendete Variable in der Erfassungsliste.Noch sauberer ist es, nur Variablennamen auskommentieren:
quelle
#if 0 / #endif
Blockkommentare.Ein Mitarbeiter hat mich gerade auf dieses nette kleine Makro hier hingewiesen
Der Einfachheit halber werde ich das Makro unten einfügen.
quelle
gcckennzeichnet diese Warnungen standardmäßig nicht. Diese Warnung muss entweder explizit durch Übergabe
-Wunused-parameter
an den Compiler oder implizit durch Übergabe-Wall -Wextra
(oder möglicherweise eine andere Kombination von Flags) aktiviert worden sein.Nicht verwendete Parameterwarnungen können einfach durch Übergabe
-Wno-unused-parameter
an den Compiler unterdrückt werden. Beachten Sie jedoch, dass dieses Deaktivierungsflag nach möglichen Aktivierungsflags für diese Warnung in der Compiler-Befehlszeile stehen muss, damit es wirksam wird.quelle
makellose und tragbare Methode, um einen oder mehrere Parameter als nicht verwendet zu deklarieren :
quelle
Die Verwendung von Präprozessor-Direktiven wird die meiste Zeit als böse angesehen. Idealerweise möchten Sie sie wie die Pest vermeiden. Denken Sie daran, dass es einfach ist, den Compiler dazu zu bringen, Ihren Code zu verstehen, und dass es für andere Programmierer viel schwieriger ist, Ihren Code zu verstehen. Ein paar Dutzend solcher Fälle hier und da machen es sehr schwer, später für sich selbst oder für andere zu lesen.
Eine Möglichkeit könnte darin bestehen, Ihre Parameter in einer Art Argumentklasse zusammenzufassen. Sie können dann nur eine Teilmenge der Variablen verwenden (entspricht wirklich Ihrer Zuweisung von 0) oder für jede Plattform unterschiedliche Spezialisierungen dieser Argumentklasse haben. Dies lohnt sich jedoch möglicherweise nicht. Sie müssen analysieren, ob es passt.
Wenn Sie unmögliche Vorlagen lesen können, finden Sie möglicherweise erweiterte Tipps im Buch "Außergewöhnliches C ++". Wenn die Leute, die Ihren Code lesen würden, ihre Fähigkeiten dazu bringen könnten, die verrückten Dinge zu erfassen, die in diesem Buch gelehrt werden, dann hätten Sie einen schönen Code, der auch leicht zu lesen ist. Der Compiler weiß auch genau, was Sie tun (anstatt alles durch Vorverarbeitung auszublenden).
quelle
#define UNUSED(expr) (void)(expr)
angemessen nennen .Zunächst wird die Warnung durch die Variablendefinition in der Quelldatei und nicht durch die Headerdatei generiert. Der Header kann makellos bleiben und sollte, da Sie möglicherweise etwas wie Sauerstoff verwenden, um die API-Dokumentation zu generieren.
Ich gehe davon aus, dass Sie eine völlig andere Implementierung in Quelldateien haben. In diesen Fällen können Sie entweder den fehlerhaften Parameter auskommentieren oder einfach den Parameter schreiben.
Beispiel:
Dies mag kryptisch erscheinen, also definiert man ein Makro wie UNUSED. MFC hat es so gemacht:
So sehen Sie die Warnung noch in Debug-Builds, könnte hilfreich sein.
quelle
Ist es nicht sicher, Parameternamen immer auskommentieren? Wenn nicht, können Sie so etwas tun
Es ist ein bisschen weniger hässlich.
quelle
Mit einem
UNREFERENCED_PARAMETER(p)
könnte funktionieren. Ich weiß, dass es in WinNT.h für Windows-Systeme definiert ist und auch für gcc leicht definiert werden kann (falls es noch nicht vorhanden ist).UNREFERENCED PARAMETER(p)
ist definiert alsin WinNT.h.
quelle
Ich habe dies gesehen, anstatt
(void)param2
die Warnung zum Schweigen zu bringen:Sieht so aus, als wäre dies in C ++ 11 hinzugefügt worden
quelle
Verwenden Sie das Compiler-Flag, z. B. das Flag für GCC:
-Wno-unused-variable
quelle
Sie können
__unused
dem Compiler mitteilen, dass die Variable möglicherweise nicht verwendet wird.quelle
__unused
es kein Standard-C ++ ist und mehr auf den Punkt gebracht wird, ist es auch nicht das, was Sie gepostet haben ... Das ist Objective-C. Diese Antwort ist also nur für bestimmte Compiler wirklich nützlich und macht den Code nicht portierbar und in der Tat nicht wirklich gültig, da Benutzercode keine Bezeichner verwenden soll__
, die mit beginnen und für die Implementierung reserviert sind.In C ++ 11 ist dies die Lösung, die ich verwende:
Es wurde bestätigt, dass es portabel ist (zumindest auf modernen MSVC-, Clang- und GCC-Geräten) und keinen zusätzlichen Code erzeugt, wenn Optimierungen aktiviert sind. Ohne Optimierung wird der zusätzliche Funktionsaufruf ausgeführt und Verweise auf die Parameter werden in den Stapel kopiert, es sind jedoch keine Makros beteiligt.
Wenn der zusätzliche Code ein Problem darstellt, können Sie stattdessen diese Deklaration verwenden:
Zu diesem Zeitpunkt bietet ein Makro jedoch eine bessere Lesbarkeit:
quelle
Dies funktioniert gut, erfordert jedoch C ++ 11
quelle
ALLCAPS
etwas anderes als Makros zu verwenden, um sie hässlich und unerwünscht aussehen zu lassen, aber das ist wirklich nichts Schlechtes, außer dass astatic_cast
schöner wäre.Ich habe festgestellt, dass die meisten der vorgestellten Antworten nur für lokale nicht verwendete Variablen funktionieren und Kompilierungsfehler für nicht verwendete statische globale Variablen verursachen.
Ein weiteres Makro musste die Warnung vor nicht verwendeten statischen globalen Variablen unterdrücken.
Dies funktioniert, da für nicht statische globale Variablen im anonymen Namespace keine Warnung gemeldet wird.
C ++ 11 ist jedoch erforderlich
quelle
Lol! Ich glaube nicht, dass es auf SO eine andere Frage gibt, die alle vom Chaos korrumpierten Ketzer besser enthüllt als diese!
Bei allem Respekt vor C ++ 17 gibt es in den C ++ - Kernrichtlinien eine klare Richtlinie . AFAIR, im Jahr 2009 war diese Option genauso verfügbar wie heute. Und wenn jemand sagt, dass es in Doxygen als Fehler angesehen wird, dann gibt es in Doxygen einen Fehler
quelle
Ich sehe Ihr Problem mit der Warnung nicht. Dokumentieren Sie im Methoden- / Funktionsheader, dass der Compiler xy hier eine (korrekte) Warnung ausgibt, diese Variablen jedoch für die Plattform z benötigt werden.
Die Warnung ist korrekt und muss nicht ausgeschaltet werden. Es macht das Programm nicht ungültig - aber es sollte dokumentiert werden, dass es einen Grund gibt.
quelle