2012-07-18 11 views
5

Dla rejestrowania debugowania, mam często postrzegane i wykorzystywane coś podobnegoWłaściwa C preprocesora makro no-op

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

ale w wielu miejscach, widziałem drugi #define zastąpione

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

W szczególności istnieje this answer, a komentarz na temat this other answer dla tego samego pytania sugeruje, że problem byłby w sytuacji takiej, jak:

if (condition) 
    DLOG("foo"); 

chociaż mój szybki test sugeruje, że wynikowy średnik na linii sam w sobie będzie służył jako instrukcja no-op wewnątrz warunkowego.

Czy jedno lub drugie z nic nie jest lepsze niż i do {} while (0)? Jeśli tak, dlaczego? Czy jest coś jeszcze lepszego?

+0

możliwy duplikat [do {...} gdy (0) do czego służy?] (Http://stackoverflow.com/questions/257418/do-while-0-what-is-it-good -dla) –

Odpowiedz

5

Aby uzyskać wyjaśnienie, dlaczego chcesz innej formy nieobsługiwania, zobacz stronę C#define macro for debug printing. Chcesz mieć kompilator analizowania kodu drukowania debug nawet wtedy, gdy nie jest używany tak, że błędy nie pełzanie w

0

Szybka odpowiedź brzmi, że metoda do/while pozwala na wymianę wielu słów i nadal używa go jako pojedynczej instrukcji w przypadku if, tak jak w pytaniu. Jeśli chodzi o zastąpienie pojedynczego wyrażenia, nie sądzę, że jest jakaś różnica.

7

średnik sama ma dwie wady.

  • Użytkownicy swojej makro puszki zapisz go bez średnika, a kompilator nie będzie narzekał, i
  • Niektóre kompilatory mogą wydawać ostrzeżenia o prawdopodobnie zabłąkanym średniku.

W do {} while (0) adresy sztuczka oba te obawy:

DLOG("foo") // No semicolon 

wywoła błąd i kompilator nie będzie ostrzegać o „bezpańskich” średnikiem.

Powiązane problemy