SORU
10 ŞUBAT 2012, Cuma


Ne ":-!!&"C kodu?

/usr/include/linux/kernel.h tuhaf bir makro kodu rastladım:

/* Force a compilation error if condition is true, but also produce a
   result (of value 0 and type size_t), so the expression can be used
   e.g. in a structure initializer (or where-ever else comma expressions
   aren't permitted). */
#define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); }))
#define BUILD_BUG_ON_NULL(e) ((void *)sizeof(struct { int:-!!(e); }))

:-!! ne yapar?

CEVAP
10 ŞUBAT 2012, Cuma


Bu, aslındayapı başarısız ifade e 0, ve değilse, değerlendirilebilir olup olmadığını kontrol etmek için bir yol.

Makro biraz yanlış isim vermişler; BUILD_BUG_OR_ZERO yerine ...ON_ZERO gibi bir şey daha olmalı. (Olmuşturoccasional discussions about whether this is a confusing name.)

Böyle ifade okumalısınız:

sizeof(struct { int: -!!(e); }))
  1. (e): Hesaplama ifadesi e.

  2. !!(e): Mantıklı inkar iki kez: e == 0; aksi halde 1 10**.

  3. -!!(e): Sayısal olarak inkar: e == 0; aksi halde -1 0.

  4. struct{int: -!!(0);} --> struct{int: 0;}: Eğer sıfır olsaydı, o zaman sıfır genişlik olan anonim bir tamsayı bit ile bir yapı ilan ediyoruz. Her şey yolunda ve normal olarak devam edin.

  5. struct{int: -!!(1);} --> struct{int: -1;}: eğer diğer taraftandeğilsıfır, negatif bir sayı olacak. Herhangi bir bit bildirmekolumsuzgenişlik derleme bir hata.

Ya da güzel olan bir yapı genişliği 0, ya da bir derleme hatası olan olumsuz genişlik, bir bit bir bit ile rüzgar ederiz. Sonra uygun genişlik e sıfır olduğu durumda sıfır olacaktır) ile size_t böylece sizeof saha alıyoruz.

Bazı insanlar şu soruyu sordu:Neden sadece assert kullanmıyorlar?

keithmo's answer burada iyi bir yanıt vardır:

Bu makrolar, bir derleme zamanı test ederken iddia uygulamak() bir çalıştırma testi.

Kesinlikle doğru. Senin sorunları tespit etmek istemezsinçekirdekzamanında bunu daha önce fark olabilirdi! İşletim sistemin kritik bir parçası. Ne ölçüde sorunlar zaman, çok daha iyi derleme sırasında tespit edilebilir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Dom Esposito

    Dom Esposito

    26 Mayıs 2011
  • jedimasterkyle

    jedimasterky

    11 ŞUBAT 2006
  • nigahiga

    nigahiga

    21 Temmuz 2006