Durante la risposta al post this, ho suggerito di utilizzare do {...} while(0)
per macro multilinea.è `warning C4127` (l'espressione condizionale è costante) sempre utile?
Su MSVC, ho trovato questo codice getta in su:
warning C4127: conditional expression is constant
per rendere il codice di allarme-libera, ho bisogno di scegliere una di queste brutte alternative:
Opzione 1
#ifdef _MSC_VER
#pragma warning(push)
#pragma warning(disable:4127)
#endif
code_using_macro_that_generates_C4217;
#ifdef _MSC_VER
#pragma warning(pop)
#endif
Opzione 2
definire il mio macro come:
#define MULTI_LINE_MACRO do { ... } while(0,0)
o
#define MULTI_LINE_MACRO do { ... } while((void)0,0)
chiamato anche "civetta" da alcuni programmatori come (0,0)
sembra un gufo.
Opzione 3
definire un nuovo WHILE_0 macro che non genera un messaggio di avviso e utilizzarlo al posto di while(0)
Problema
Credo che tutte le alternative sono più o meno orribile. Perché MSVC genera questo avviso per codice apparentemente corretto e mi motiva ad aggiungere un po 'di bruttezza al mio codice per mantenere libero il codice di avviso?
Credo che le espressioni costanti in condizionali siano perfettamente valide e utili, in particolare nei costrutti basati sulla capacità del compilatore di ottimizzare il codice.
Inoltre non ottengo un warning C4127
per codice come questo:
void foo(unsigned bar)
{
while (bar >= 0)
;
}
La mia domanda è: non è warning C4127: conditional expression is constant
completamente inutile e non è vero motivare codice brutto? Questo avvertimento aiuta sempre a scrivere un codice migliore?
@Bathsheba: ma 'for (;;)' non ha lo stesso significato di 'fare {' '...} while (0)' !!!! –
Bene se MSVC supporta C11 (* che non *), l'avviso non avrebbe molto senso dal momento che C11 ha un'eccezione specifica per [espressioni costanti come espressione di controllo per impedire l'ottimizzazione di loop infiniti] (http: // stackoverflow.it/a/28681034/1708801) Mi rendo conto che questo è il caso opposto, ma vale comunque. –
Rimuovi il 'pragma' e [#include" no_sillywarnings_please.h "] (https://alfps.wordpress.com/the-no_sillywarnings_please-h-file/) –