Frage

In einem Codierungsstil Frage zu unendlichen Schleifen, Einige Leute erwähnten, dass sie den für (; ;;) Stil bevorzugen, weil der (wahre) Stil Warnmeldungen auf MSVC über einen bedingten Ausdruck stellt, der konstant ist.

Dies hat mich sehr überrascht, da die Verwendung konstanter Werte in bedingten Ausdrücken eine nützliche Möglichkeit ist, #ifdef Hell zu vermeiden. Zum Beispiel können Sie in Ihrem Header haben:

#ifdef CONFIG_FOO
extern int foo_enabled;
#else
#define foo_enabled 0
#endif

Und der Code kann einfach einen bedingten verwenden und dem Compiler vertrauen, um den toten Code zu elide, wenn config_foo nicht definiert ist:

if (foo_enabled) {
    ...
}

Anstatt jedes Mal auf config_foo zu testen, wenn Foo_Enabled verwendet wird:

#ifdef CONFIG_FOO
if (foo_enabled) {
    ...
}
#endif

Dieses Entwurfsmuster wird ständig im Linux -Kernel verwendet (beispielsweise include/linux/cpumask.h definiert mehrere Makros bis 1 oder 0, wenn SMP deaktiviert ist, und zu einem Funktionsaufruf, wenn SMP aktiviert ist).

Was ist der Grund für diese MSVC -Warnung? Gibt es außerdem eine bessere Möglichkeit, #ifdef Hell zu vermeiden, ohne diese Warnung deaktivieren zu müssen? Oder ist es eine übermäßig breite Warnung, die im Allgemeinen nicht aktiviert werden sollte?

War es hilfreich?

Lösung

Eine Warnung bedeutet nicht automatisch, dass Code ist Schlecht, nur verdächtig aussehend.

Persönlich beginne ich von der Position, alle Warnungen zu aktivieren, die ich kann, und schalten dann alle aus, die sich als nützlicher erweisen. Das ist normalerweise der erste, der zu einem Bolem, wenn Sie etwas zu einem Bool werfen, der erste ist.

Andere Tipps

Ich denke, der Grund für die Warnung ist, dass Sie versehentlich einen komplexeren Ausdruck haben könnten, der eine Konstante bewertet, ohne es zu merken. Angenommen, Sie haben eine solche Erklärung in einem Kopfball:

const int x = 0;

Später, weit entfernt von der X -Erklärung, haben Sie einen Zustand wie:

if (x != 0) ...

Sie werden vielleicht nicht bemerken, dass es sich um einen ständigen Ausdruck handelt.

Ich glaube, es ist, Dinge zu fangen wie

 if( x=0 )

Wenn du meinst

 if( x==0 )

Ein einfacher Weg, um die Warnung zu vermeiden, wäre:

#ifdef CONFIG_FOO
extern int foo_enabled;
#else
extern int foo_enabled = 0;
#endif
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top