BUILD_BUG_ON_ZERO

BUILD_BUG_ON_ZERO Linux kernel.h başlık dosyasında kullanılan makrolardan biri.

Yanlış ya da kötü isimlendirme daha sonra raporlanmış ve makroların BUILD_BUG_OR_ZERO olarak değiştirilmesi önerilmiş. Ama makrolarda başka sorunlar da var.
Birinci makrodaki amaç bir ifadenin değerinin 0 olmaması durumunda, yani ifadenin lojik yanlış olmaması durumunda derleme zamanı hatası oluşturmak. Yani yanlış olması gereken bir ifadeyi derleme zamanında doğrulamak için kullanılan bir makro. Peki neden bu amaçla standart assert makrosunu kullanmıyoruz?” assert makrosundaki ifade programın çalışma zamanında değerlendiriyor. Oysa burada amaç kaynak kodda beklenenin dışında bir ifade oluştuğunda bu yanlışlığı derleme zamanında yakalamak.
Şimdi makronun nasıl çalıştığına bakalım:

herhangi bir ifade olmak üzere

ifadesinin değeri sıfır dışı değerdeki yani lojik doğru olan ifadeler için 0, 0 değerindeki yani lojik doğru değerdeki ifadeler için 1

ile e ifadesinin lojik değeri olan 0 ya da 1 değeri elde ediliyor.

ile 0 değerindeki ifadeler için 0, sıfır dışı değerlerdeki ifadeler için -1 değeri elde ediliyor.

Etiket kullanılmadan bildirilen yapının isimsiz (anonim) bir bit alanı (bitfields) öğesi var. iki nokta üst üste atomundan sonra kullanılması gereken sabit bu öğeye kaç bit ayrıldığını gösteriyor. Bu değerin negatif olması sözdizim hatası. Yani lojik doğru olan e ifadeleri için derleyici sözdizim hatası verecek.

İfade sizeof işlecinin terimi  yapılmış. Böylece ifadenin geçerli olması durumunda ifadenin değerinin 0 sabiti (lojik yanlış) olması istenmiş.  Makro büyük ölçüde GCC derleyicisinin eklentileri ile destekleniyor. Yoksa standart C açısından makroda ciddi sorunlar var:
Yapı bildirminde isimlendirilmemiş bir yapı öğesi kullanıldığında kodun geçeri olabilmesi için yapının en az bir isimlendirilmiş öğeye sahip olması gerekiyor:

Bir başka sorun da sizeof işlecinin ürettiği değerinin 0 olma garantisinin bulunmayışı. Eğer ifade geçerli olsaydı bir adreslemenin yapılabilmesi için sizeof değeri yine 0 olmayacaktı. Aşağıdaki kodu kendi derleyicim ile derlediğimde çalışan programın ekran çıktısı 4 oldu:

Linux çekirdek kodları daha sonra derleme zamanı doğrulamaları için aşağıdaki makroyu kullanmış:

Bu makroda bir sorun görünmüyor:
e ifadesinin doğru olması durmunda sizeof işlecinin terimi –1 boyutunda bir char dizi türü olacak ki bu bir sözdizim hatası.
e ifadesinin yanlış olması durumunda ise ifadenin değeri 0 olacak.
C11 standartlarıyla dile static_assert makrosu ve _Static_assert anahtar sözcüğü eklendiği için C11 destekleyen bir derleiyicinin kullanılması durumunda bu tür hilelerin çoğuna artık gerek kalmıyor.

Necati Ergin

C ve Sistem Programcıları Derneğinde eğitmen olarak çalışıyor.

Bunlar da ilginizi çekebilir

BUILD_BUG_ON_ZERO” için 2 yorum

  1. Necati Bey selamlar;

    Gözümden kaçmadıysa bu ilk C yazısı oluyor. Tam bu nokta da web sitesi ile ilgili bir öneride daha bulunmak istiyorum. C ve C++ ile ilgili yazılar ayrı bir kategoride olursa okuyucuların istedikleri yazılara ulaşması daha kolay olur. Bir de her yazı için etiketlemeye gidilirse sonradan böyle bir ihtiyaç olursa fazla bir iş yükü çıkmadan şimdiden çözülmüş olur. Yardımcı olmak açısından benim düşündüğüm etiketler:

    C++11
    C++14
    C++17
    Templates
    STL
    Containers
    Variadic-templates
    Multithreading
    Lambda
    DesigPatterns
    ————————
    C89
    C11
    Pointers
    Struct
    Sockets
    DataStructures

    1. Çok teşekkür ederim. En kısa süre içinde gerekli etiketlemeyi ve kategorizasyonu yapacağız.

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Kod Eklemek İçin Okuyun