[c++] Come superare elegantemente gli avvertimenti del compilatore C ++ inutili?


Answers

Vorrei andare for(;;) anche senza quell'avvertimento. Non è stupido: è un ciclo senza condizione, che è esattamente quello che vuoi esprimere.

Mi sembra più logico che usare un ciclo while e testare che true è ancora vero ogni volta attorno al loop (ovviamente il compilatore ottimizzerà questo test, quindi non inciderà sulle prestazioni).

Question

Questa domanda non è legata a nessun avvertimento specifico del compilatore, il seguente è solo un esempio.

Attualmente quando voglio un ciclo che controlli una condizione di uscita all'interno:

 while( true ) {
    doSomething();
    if( condition() ) {
       break;
    }
    doSomethingElse();
}

Non posso semplicemente scrivere che in Visual C ++ - emetterà un'espressione conditional expression is constant C4127 conditional expression is constant avviso conditional expression is constant . Il compilatore lo saluterà in faccia anche se è abbastanza ovvio che while(true) non può essere stato scritto accidentalmente.

Supponiamo che voglio il codice che compila senza avvisi. Ci sono soluzioni alternative al mio servizio.

Il workaround uno è da usare for(;;) ma si sente stupido - perché dovrei volere quella cosa strana invece di concisa ed elegante idiomatica while(true) ? La seconda soluzione consiste nell'usare #pragma warning( suppress) prima della riga while( true ) , ma aggiunge un banner enorme che è due volte più grande di quanto lo stesso -statement while . La soluzione tre è disabilitare C4127 per l'intero progetto (l'ho visto fare in un progetto reale), ma anche tutte le possibili istanze utili di C4127 sono disabilitate.

C'è un modo elegante per sbarazzarsi di un avvertimento inutile?




La mia filosofia è che se si fa in modo che il compilatore sopprima gli avvertimenti, inserire un commento e spiegare perché. Anche se pensi che sia sciocco. Pragma si distingue ed è visibile. È un bel commento nel tuo codice.

Quando si iniziano a saltare i commenti quando si sopprimono gli avvisi in base alla propria idea su quanto sia sciocco, si sta andando verso potenziali problemi. Un'altra persona che lavora sul tuo codice dopo un anno potrebbe cambiarlo, avere problemi e perdere tempo prezioso a scovarlo.

A proposito, stai cercando un modo per sopprimere gli avvertimenti senza

  • Usa il pragma
  • Usa un codice brutto
  • Utilizzare la soppressione a livello di progetto

Quello sarebbe un metodo di soppressione molto nascosto.

Se non ti piace l'aspetto del pragma, usa

bool alwaysTrue = true; // to prevent compiler warning C4127
while (alwaysTrue) {
    ...
}



Fai qualche buffo token che incolla: se riesci a scambiare

while(true)

per

While(true)

quindi fai quanto segue:

#define while_true for( ;; )
#define While(a) while_##a





Links