In einer coding style question about infinite loops haben einige Leute erwähnt, dass sie den for (;;) -Stil bevorzugen, da der while (true) -Stil Warnmeldungen auf MSVC über einen konstanten Ausdruck gibt, der konstant ist.Konstanter Wert in Bedingungsausdruck
Das hat mich sehr überrascht, da die Verwendung von konstanten Werten in bedingten Ausdrücken ein nützlicher Weg ist, #ifdef Hölle zu vermeiden. Zum Beispiel können Sie in der Kopfzeile haben:
#ifdef CONFIG_FOO
extern int foo_enabled;
#else
#define foo_enabled 0
#endif
und der Code kann einfach eine bedingte verwenden und den Compiler vertrauen den toten Code elide wenn CONFIG_FOO nicht definiert ist:
if (foo_enabled) {
...
}
statt für CONFIG_FOO zu testen, die jedes Mal foo_enabled verwendet:
#ifdef CONFIG_FOO
if (foo_enabled) {
...
}
#endif
Dieses Entwurfsmuster die ganze Zeit im Linux-Kernel verwendet wird (zB include/linux/cpumask.h mehrere macr definiert os auf 1 oder 0, wenn SMP deaktiviert ist, und auf einen Funktionsaufruf, wenn SMP aktiviert ist.
Was ist der Grund für diese MSVC-Warnung? Gibt es außerdem einen besseren Weg, die #ifdef-Hölle zu vermeiden, ohne diese Warnung zu deaktivieren? Oder ist es eine zu breite Warnung, die generell nicht möglich sein sollte?
Guter Punkt. Dies ist ein Grund, warum man "rückwärts" Vergleiche wie "if (0 == x)" sieht - wenn man ein = -Zeichen vermisst, fängt der Compiler es! – bog
Wenn es das ist, was es fangen will, könnte es nicht nur das (Zuweisung innerhalb einer Bedingung) statt einer allgemeineren Warnung fangen? – CesarB
Das erzeugt eine andere Warnung. Mit VC++ ist es: Compiler-Warnung (Level 4) C4706 Zuweisung innerhalb der Bedingung Ausdruck – Ferruccio