sagen, dass wir die folgende for-Schleife haben:Wie elegant vermeiden "Condition is always true" Warnung für diese besondere Art von For-Schleife?
#define UPPER 0U
int i;
for(i = 0; i < UPPER; i++) {
/* foo */
}
Dies wird produzieren eine W549: condition is always true
Warnung, offensichtlich, weil wir for(i = 0; i < 0; i++)
nach Makroerweiterung erhalten. In dem tatsächlichen Code ist UPPER
ein Vorkompilierungszeitparameter (d. H. Er wird durch einige Erstellungsskripte abhängig von der Zielplattform usw. gesetzt), die irgendeinen Wert von 0 bis 255 annehmen können, und somit ist die Schleife nicht nur ein toter Code.
Wie kann ich diese Warnung elegant vermeiden, wenn UPPER == 0
?
Offensichtlich kann man wickeln Sie die for-Schleife in einer if-Anweisung:
#define UPPER 0U
if(UPPER != 0U) {
int i;
for(i = 0; i < UPPER; i++) {
/* foo */
}
}
Aber das ist nicht das, was ich elegant nennen würde.
1) haben Sie versucht, Ihre Sniplet zu kompilieren? '# define' sollte kein' = 'und'; 'haben. 2) In Ihrem Beispiel ist die Bedingung beim ersten Versuch falsch, so dass die Schleife vollständig übersprungen wird. – Serge
@Serge: Nein, ich tippte es einfach und dachte: "Was könnte * möglicherweise * schief gehen mit diesem kleinen Ausschnitt". Für den zweiten Punkt: ja, wenn "UPPER" als 0 definiert ist. Aber wie ich in der Frage zu erklären versuchte, ist dies ein Pre-Compile-Parameter, dh er kann andere Werte als 0 haben und somit ist die for-Schleife kein toter Code. – mort
@AjeetShah: Um sicherzustellen, dass ich richtig verstehe: Sie schlagen vor, eine neue Variable einzuführen, sagen wir "volatile int upper = UPPER;" und verwenden Sie diese in der for-Schleife? – mort