Wie zu unterdrücken "unbenutzte parameter" - Warnungen in C?
Zum Beispiel:
Bool NullFunc(const struct timespec *when, const char *who)
{
return TRUE;
}
In C++ ich war in der Lage, eine /*...*/
Kommentar um die Parameter. Aber nicht in C natürlich, wo es gibt mir die Fehlermeldung error: parameter name omitted
.
- möglich, Duplikat der Was ist die beste Art und Weise zu unterdrücken "Unused variable "x"-Warnung
- Diese Frage hat mehr upvotes, würde es besser sein, markieren Sie die Frage als Duplikat.
- Siehe auch die C++ - version dieser Frage
-Wno-unused-parameter
, es ist einfach zu laut und nicht selten fängt bugs esp. wenn-Wshadow
verwendet wird.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich in der Regel schreiben Sie ein makro wie dieses:
Mithilfe dieses Makros können Sie für alle verwendeten Parameter. (Hinweis: dies funktioniert auf jedem compiler.)
Beispiel:
void f(int x) {UNUSED(x);}
.#define UNUSED(...) (void)(__VA_ARGS__)
die es mir erlaubt in mehreren Variablen.warning : expression result unused [-Wunused-value]
#define UNUSED(x) ((x)=(x))
arbeitete besser fürIn gcc, können Sie die Bezeichnung der parameter mit der
unbenutzt
- Attribut.In der Praxis wird dies erreicht, indem
__attribute__ ((unused))
kurz vor dem parameter. Zum Beispiel:wird
__attribute__ ((unused))
vor dem argument.__attribute__((unused))
ist eine proprietäre GCC-Erweiterung. Es unterstützt durch einige andere Compiler, aber ich nehme an, dies funktioniert nicht mit MSVC. Es ist nicht direkt ein Teil der compiler-standard, obwohl, so ist dies nicht so portabel wie einige andere OptionenKönnen Sie mit gcc/clang nicht Attribut, jedoch benutze ich diese Makros in eine header zu vermeiden, dass die gcc-spezifischen Attributen, die alle über die Quelle, auch mit
__attribute__
überall ist ein bisschen verbose/hässlich.Dann kannst du das tun...
Ich bevorzuge diese, denn Sie erhalten eine Fehlermeldung, wenn Sie versuchen, verwenden
bar
im code an einer beliebigen Stelle, so dass Sie nicht verlassen kann, wird das Attribut versehen.und Funktionen...
Note 1):
Soweit ich weiß, MSVC nicht äquivalent zum
__attribute__((__unused__))
.Hinweis 2):
Die
UNUSED
makro nicht für die Arbeit Argumente, die Klammern enthalten,wenn du also ein argument wie
float (*coords)[3]
Sie nicht tun,float UNUSED((*coords)[3])
oderfloat (*UNUSED(coords))[3]
, Das ist der einzige Nachteil an derUNUSED
makro habe ich bisher gefunden, in diesen Fällen, die ich wieder fallen zu(void)coords;
#define __attribute__(x)
für nicht-GCC-Umgebung (AFAIK keiner der__attribute__
werden unterstützt von MSVC)?warning: unused parameter ‘foo’ [-Wunused-parameter]
(gcc 7.3.0)Mit gcc mit der nicht verwendeten Attribut:
Sehen, dass diese markiert ist, als gcc Sie können die Befehlszeilenoption
Wno-unused-parameter
.Beispiel:
Natürlich wirkt sich auf die gesamte Datei (und vielleicht Projekt, je nachdem, wo du den Schalter), aber Sie haben nicht zu ändern code.
Kennzeichnung ist das Attribut Idealer Weise. MAKRO führt irgendwann zu Verwechslungen.
und durch die Verwendung von void(x),wir sind das hinzufügen eines overhead bei der Verarbeitung.
Wenn nicht mit input-argument verwenden
Wenn nicht die definierte variable innerhalb der Funktion
Nun später mit dem hash-variable für Ihre Logik, muss aber nicht, bkt. definieren Sie bkt als nicht verwendet, sonst compiler sagt'bkt set bt nicht verwendet".
HINWEIS: Dies ist nur ein unterdrücken der Warnung, nicht für die Optimierung.
void(x)
, der compiler optimiert es aus.Einen gcc/g++ - spezifische Art und Weise zu unterdrücken, die nicht verwendeten parameter Warnung für einen block des Quellcodes zu umschließen Sie es mit den folgenden pragma-Anweisungen:
Ich hab das gleiche problem. Ich verwendet eine Drittanbieter-Bibliothek. Wenn ich kompilieren, die diese Bibliothek, der compiler (gcc/clang) beklagen sich über nicht verwendete Variablen.
Wie diese
So ist die Lösung ziemlich klar. Hinzufügen
-Wno-unused
gcc/clang CFLAG werden unterdrückt, alle "ungenutzten" Warnungen, dachte sogar, Sie haben-Wall
gesetzt.Auf diese Weise BRAUCHEN Sie NICHT zu ändern code.
In MSVC zu unterdrücken, eine bestimmte Warnung es ist genug, um geben Sie die Nummer, um compiler-as /wd#. Meine CMakeLists.txt solche enthält der block:
Kann ich jetzt nicht sagen, was genau /wd4512 /wd4702 /wd4100 /wd4510 /wd4355 /wd4127 meinst, weil ich nicht zahlen keine Aufmerksamkeit auf MSVC für drei Jahre, aber Sie unterdrücken superpedantic Warnungen, die keinen Einfluss auf das Ergebnis.
Ich habe gesehen, dieser Stil wird verwendet:
struct { int a; } b = {1}; if (b);
GCC warnt,used struct type value where scalar is required
.Für die Aufnahme, ich mag Job ' s Antwort oben aber ich bin neugierig auf eine Lösung, die nur mit dem Namen der Variablen, indem Sie sich in einer "do-nothing" - Anweisung:
Sicher, dies hat Nachteile; zum Beispiel dann, ohne das "unbenutzte" Hinweis: es sieht aus wie ein Fehler, anstatt eine vorsätzliche Zeile des Codes.
Der Vorteil ist, dass keine DEFINIEREN, die benötigt wird, und entledigt er sich der Warnung.
Gibt es irgendwelche performance -, Optimierungs-oder andere Unterschiede?