9.1. assert.h
: Diyagnostikler
Bu dosyada, yürütme esnasında bir savı (mantıksal ifadeyi) kontrol edip, eğer yanlışsa bir tanı görüntüleyen bir fonksiyon veya makro tanımı vardır:
void assert(mantıksal_ifade)
Eğer bu dosya programa içerilmeden önce NDEBUG
makrosu
#define
ile tanımlanmışsa,
assert
çağrısı dikkate alınmaz; aksi takdirde aşağıdaki
makro tanımındakine benzer bir durum gerçekleşir:
#define assert(exp) { \ if (!(exp)) { \ fprintf(stderr, \ "Assertion failed: %s, function %s, file %s, line %d.\n", \ #exp, __func__, __FILE__, __LINE__); \ abort(); \ } \ }
Diğer yandan, yürütme sırasında değil de, derleme sırasında bir savı kontrol
edip, eğer yanlışsa bir derleyici mesajı oluşturmak isterseniz, C diline daha
sonradan eklenen _Static_assert
anahtar sözcüğünü
kullanabilirsiniz. Genel sözdizim şöyledir:
_Static_assert ( değişmez_ifade , değişmez_karakter_dizisi );
veya
_Static_assert ( değişmez_ifade );
Burada, değişmez_ifade derleme sırasında
hesaplanabilen, mantıksal, yani tamsayı bir ifade olmalıdır. Eğer değeri
sıfırdan farklı yani doğru
ise, _Static_assert
deyiminin bir etkisi olmaz. Aksi takdirde (yani yanlış
ise)
değişmez_ifade ile hesaplanan savın gerçekleşmemesi yüzünden,
derleyici tarafından (verildiği takdirde, değişmez_karakter_dizisini
de içeren) bir tanılayıcı ileti oluşturulur. Örneğin, aşağıdaki satırları
program kaynak kodunun herhangi uygun bir yerine yazdığınızda ve
programı sizeof(int)
’in değerinin 2 veya
daha düşük olduğu ortamlarda derlemeye kalktığınızda, derleyici ilgili hata
mesajını verecektir:
_Static_assert (sizeof(int)>2, "16 bitlik ortamda bu programi derleyemezsiniz!");
Her durumda, yukarıdakinin yürütülebilir bir kod oluşturmayacağına dikkat edin. Bu yüzden bu satırları programda uygun herhangi bir yere, fonksiyon içine veya dışına koyabilirsiniz.
assert.h
dosyasında _Static_assert
anahtar sözcüğünü static_assert
makrosuna eşitleyen aşağıdaki
tanım bulunmaktadır:
#define static_assert _Static_assert