Zum Beispiel:
Bool NullFunc(const struct timespec *when, const char *who)
{
return TRUE;
}
In C ++ konnte ich /*...*/
die Parameter kommentieren. Aber natürlich nicht in C, wo es mir den Fehler gibt error: parameter name omitted
.
c
gcc
gcc-warning
Nixgadget
quelle
quelle
-Wno-unused-parameter
, es ist einfach zu laut und fängt selten Fehler, insb. wann-Wshadow
wird verwendet.Antworten:
Normalerweise schreibe ich ein Makro wie folgt:
Sie können dieses Makro für alle nicht verwendeten Parameter verwenden. (Beachten Sie, dass dies auf jedem Compiler funktioniert.)
Beispielsweise:
quelle
void f(int x) {UNUSED(x);}
.#define UNUSED(...) (void)(__VA_ARGS__)
, wodurch ich dies auf mehrere Variablen anwenden kann.In gcc können Sie den Parameter mit dem
unused
Attribut kennzeichnen .In der Praxis wird dies erreicht, indem
__attribute__ ((unused))
direkt vor den Parameter gesetzt wird. Beispielsweise:wird
quelle
__attribute__ ((unused))
dem Argument zu stellen.__attribute__((unused))
es sich um eine proprietäre GCC-Erweiterung handelt . Es wird von einigen anderen Compilern unterstützt, aber ich gehe davon aus, dass dies mit MSVC nicht funktioniert. Es ist jedoch nicht direkt Teil des Compiler-Standards, daher ist dies nicht so portabel wie einige andere OptionenSie können das nicht verwendete Attribut von gcc / clang verwenden. Ich verwende diese Makros jedoch in einem Header, um zu vermeiden, dass gcc-spezifische Attribute in der gesamten Quelle vorhanden sind. Außerdem
__attribute__
ist es etwas ausführlich / hässlich , überall zu haben.Dann können Sie tun ...
Ich bevorzuge dies, weil Sie eine Fehlermeldung erhalten, wenn Sie versuchen, zu verwenden
bar
den Code irgendwo zu verwenden, damit Sie das Attribut nicht versehentlich belassen können.und für Funktionen ...
Anmerkung 1):
Soweit ich weiß, hat MSVC kein Äquivalent zu
__attribute__((__unused__))
.Hinweis 2):
Das
UNUSED
Makro funktioniert nicht für Argumente, die Klammern enthalten.Wenn Sie also ein Argument wie
float (*coords)[3]
Sie haben es nicht können,float UNUSED((*coords)[3])
oderfloat (*UNUSED(coords))[3]
: Dies ist der einzige Nachteil desUNUSED
Makros, das ich bisher gefunden habe. In diesen Fällen greife ich zurück zu(void)coords;
quelle
#define __attribute__(x)
für Nicht-GCC-Umgebungen (AFAIK keine__attribute__
von MSVC unterstützt)?warning: unused parameter ‘foo’ [-Wunused-parameter]
setze , nachdem ich (gcc 7.3.0) bekommen habeMit gcc mit dem nicht verwendeten Attribut:
quelle
Da dies als gcc markiert ist, können Sie den Befehlszeilenschalter verwenden
Wno-unused-parameter
.Beispielsweise:
Dies wirkt sich natürlich auf die gesamte Datei aus (und möglicherweise auf das Projekt, je nachdem, wo Sie den Schalter eingestellt haben), aber Sie müssen keinen Code ändern.
quelle
Eine gcc / g ++ - spezifische Möglichkeit, die nicht verwendete Parameterwarnung für einen Quellcodeblock zu unterdrücken, besteht darin, sie den folgenden Pragma-Anweisungen beizufügen:
quelle
Das Beschriften des Attributs ist ideal. MAKRO führt manchmal zu Verwirrung. und mit void (x) fügen wir einen Overhead bei der Verarbeitung hinzu.
Wenn Sie kein Eingabeargument verwenden, verwenden Sie
Wenn Sie die in der Funktion definierte Variable nicht verwenden
Verwenden Sie später die Hash-Variable für Ihre Logik, benötigen Sie jedoch kein bkt. Definieren Sie bkt als nicht verwendet, andernfalls sagt der Compiler "bkt set bt not used".
HINWEIS: Dies dient nur dazu, die Warnung zu unterdrücken, die nicht zur Optimierung dient.
quelle
void(x)
, der Compiler optimiert ihn.Ich habe das gleiche Problem. Ich habe eine Bibliothek des dritten Teils benutzt. Wenn ich diese Bibliothek kompiliere, beschwert sich der Compiler (gcc / clang) über nicht verwendete Variablen.
So was
Die Lösung ist also ziemlich klar. Wenn Sie
-Wno-unused
als gcc / clang CFLAG hinzufügen, werden alle "nicht verwendeten" Warnungen unterdrückt, auch wenn Sie sie-Wall
festgelegt haben.Auf diese Weise MÜSSEN Sie keinen Code ändern.
quelle
In MSVC reicht es aus, die zu kompilierende Nummer als / wd # anzugeben, um eine bestimmte Warnung zu unterdrücken. Meine CMakeLists.txt enthält den folgenden Block:
Jetzt kann ich nicht genau sagen, was / wd4512 / wd4702 / wd4100 / wd4510 / wd4355 / wd4127 bedeutet, da ich MSVC drei Jahre lang keine Aufmerksamkeit schenke, aber sie unterdrücken superpedantische Warnungen, die das Ergebnis nicht beeinflussen.
quelle
Ich habe gesehen, wie dieser Stil verwendet wurde:
quelle
struct { int a; } b = {1}; if (b);
GCC warnt ,used struct type value where scalar is required
.Für die Aufzeichnung mag ich Hiobs Antwort oben, aber ich bin neugierig auf eine Lösung, bei der nur der Variablenname allein in einer "Nichtstun" -Anweisung verwendet wird:
Sicher, das hat Nachteile; Ohne die "unbenutzte" Notiz sieht es beispielsweise eher nach einem Fehler als nach einer absichtlichen Codezeile aus.
Der Vorteil ist, dass keine DEFINE benötigt wird und die Warnung entfernt wird.
Gibt es Leistungs-, Optimierungs- oder andere Unterschiede?
quelle