Standart C Programlama Dili


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