2012-07-18 22 views
5

, sık sık görülen veUygun C önişlemci makro no-op ayıklama kaydı için

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

gibi ama yerlerde bir dizi şey kullanmış, ben ikinci #define

#define DLOG(fmt, args...) do {} while (0) 
ile değiştirilir gördük

Özellikle, this answer var ve aynı soru için this other answer yorum, sorunun

gibi bir durumda olacağını gösterir. Bununla birlikte, hızlı testim, sonuçta ortaya çıkan noktalı virgülün, koşulun içinde no-op ifadesi olarak kullanılacağını gösterir.

'un biri veya diğeri ve do {} while (0) iyidir? Öyleyse neden? Daha iyi olan başka bir şey var mı?

+0

olası yinelenen [do {...} while (0) ne işe yarar?) (Http://stackoverflow.com/questions/257418/do-while-0-what-is-it-good -için) –

cevap

5

Farklı bir no-op formu neden istediğinizin açıklaması için C#define macro for debug printing'a bakın. Sen bunu kullanmadığınız zamanlarda hatalar sürünme kalmamak derleyici bile ayıklama baskı kodu ayrıştırmak istiyorum

0

Hızlı yanıt, do/while yönteminin bir çoklu deyim değiştirmenize izin vermesi ve yine de sorunuzu yaptığınız gibi bir if vakasında tek bir deyim olarak kullanabilmenizdir. Tek bir ifade değişimi için, hiçbir fark olmadığını düşünüyorum.

7

Kendi başına bir noktalı virgül iki sakıncaları vardır. Makro kutunun

  • Kullanıcılar noktalı virgül yazmadan yazın ve derleyici bundan şikayetçi olmaz ve
  • Bazı derleyiciler, olası bir noktalı virgülle ilgili bir uyarı verebilir.

do {} while (0) hüner adresleri hem bu endişeler:

DLOG("foo") // No semicolon 

bir hata tetikleyecek ve derleyici bir "başıboş" noktalı virgül hakkında uyarmak olmaz.