2012-07-18 23 views
5

Per la registrazione di debug, ho spesso visto e utilizzato qualcosa comecorretta C preprocessore macro no-op

#ifdef DEBUG 
    #define DLOG(fmt, args...) printf("%s:%d "fmt,__FILE__,__LINE__,args) 
#else 
    #define DLOG(fmt, args...) 
#endif 

ma in un certo numero di posti, ho visto il secondo #define sostituito con

#define DLOG(fmt, args...) do {} while (0) 

In particolare, c'è this answer e il commento su this other answer alla stessa domanda suggerisce che il problema sarebbe in una situazione come

if (condition) 
    DLOG("foo"); 

sebbene il mio test rapido suggerisca che il punto e virgola risultante sulla linea da solo servirà da dichiarazione non operativa all'interno del condizionale.

L'uno o l'altro di non c'è niente di meglio e do {} while (0)? Se è così, perché? C'è qualcos'altro che è ancora meglio?

+0

possibile duplicato di [do {...} while (0) a cosa serve?] (Http://stackoverflow.com/questions/257418/do-while-0-quante-è-it-buono -per) –

risposta

5

Vedere C#define macro for debug printing per una spiegazione del motivo per cui si desidera una diversa forma di no-op. Volete avere il compilatore analizza il codice di debug stampa anche quando non lo si utilizza in modo che gli errori non si insinuino in

0

La risposta rapida è che il metodo do/while ti consente di avere una sostituzione multi-statement e di usarla ancora come singola istruzione in un caso if come nella tua domanda. Per una sostituzione di una sola espressione, non penso ci sia alcuna differenza.

7

Un punto e virgola per sé ha due svantaggi:.

  • Gli utenti del vostro possibile macro scrivilo senza punto e virgola, e il compilatore non si lamenterà, e
  • Alcuni compilatori potrebbero emettere un avviso su un eventuale punto e virgola.

I do {} while (0) indirizzi trucco entrambe queste preoccupazioni:

DLOG("foo") // No semicolon 

attiverà un errore, e il compilatore non avvisa su un punto e virgola "randagi".

Problemi correlati