Bir yazılımı geliştirirken "imkansız" hatalara ve temel kabullerdeki çatışmalara karşı bazı stratejik yerlere denetimler yerleştirmek iyi olur. Bu çeşit denetimler örneğin, yazılımın farklı parçaları arasında, arayüzlerle hata ayıklama sorunlarını gidermeye yardımcı olur.
assert makrosu
assert.h başlık dosyasında tanımlanmıştır ve yazılımda bir hata saptandığında bir ileti basarak yazılımın çıkması için kullanışlı bir yol sağlar.
Yazılımınızın artık hatalardan arındığı düşündüğünüzde,
assert makrosu tarafından uygulanan hata denetimlerini,
NDEBUG makrosunu tanımladıktan sonra yazılımınızı yeniden derleyerek iptal edebilirsiniz. Yani, bu denetimleri iptal etmek için yazılımınızın kaynak kodunu değiştirmeniz gerekmez.
Ancak bu kararlılık denetimlerinin iptal edilmesi, bu denetimler yazılımınızın çalışmasını kaydadeğer oranda yavaşlatmadıkça yapılmasa iyi olur. Yazılımın çalışmasına çok etki etmedikçe daha fazla hata denetimi yapılması daha iyidir. Başlangıç seviyesinde bir kullanıcı bir yazılımın çökmesi sırasında hiçbir uyarı görmezse herşeyi yanlış yaptığı sanısına kapılabilir.
Yazılımın o noktasında ifade sıfırdan farklıysa yazılımcının kanaatini doğrular.
NDEBUG tanımlı değilse,
assert ifadenin değerini sınamaya tabi tutar. Sınama sonucu yanlışsa (sıfır),
assert aşağıdakine benzer bir hata iletisini
standart hataya (
stderr) basarak
yazılımı sonlandırır:
dosya:satırno: işlev: `ifade' savı başarısız oldu.
Dosya ismi ve satır numarası __FILE__ ve __LINE__ C önişlemci makrolarıyla saptanır ve assert çağrısının yapıldığı yeri belirtir. GNU C derleyicisi kullanılırken, işlevin yani assert çağrısının işlev ismi __PRETTY_FUNCTION__ yerleşik değişkeninden alınır; daha eski derleyicilerde işlev ismi ve onu izleyen iki nokta üstüste yoktur.
NDEBUG önişlemci makrosu assert.h dosyasının içerildiği satırdan önce tanımlanmışsa, assert makrosu mutlak olarak hiçbir şey yapmamak üzere tanımlanmış olur.
| Uyarı |
---|
NDEBUG etkili ise argüman olarak verilen ifade değerlendirilmez. Bu yüzden, yan etkileri olan ifadeleri argüman olarak kullanmayın. Örneğin assert (++i > 0); gibi bir deyimi asla kullanmayın, çünkü NDEBUG tanımlıysa i hiçbir zaman arttırılmayacaktır. |
Kimi zaman bir işletim sistemi işlevinden dönen bir hatanın denetlenmesinin istenebileceği "imkansız" durumlar olabilir. Bu durumda sadece yazılımın nerede çöktüğünü değil, neden çöktüğünün de bildirilmesi faydalıdır. assert_perror makrosu bunu kolayca yapar.
void assert_perror | (int hatanum) |
makro
hatanum değerinin sıfır olduğunu doğruladığı durumda assert işlevine benzer.
NDEBUG tanımlı değilse, assert_perror hatanum değerine bakar. Değer sıfırdan farklıysa, assert_perror aşağıdaki iletiye benzer bir hata iletisini standart hataya basarak yazılımı sonlandırır:
dosya:satırno: işlev: hata iletisi
Dosya ismi, satır numarası ve işlev ismi
assert işlevindeki gibi elde edilir.
hata iletisi ise,
strerror (hatanum) işlevinin sonucudur. Bkz.
Hata İletileri.
assert işlevinde olduğu gibi, NDEBUG önişlemci makrosu assert.h dosyasının içerildiği satırdan önce tanımlanmışsa, assert_perror makrosu mutlak olarak hiçbir şey yapmamak üzere tanımlanmış olur. Bu durumda argüman olarak verilen hatanum değerlendirilmez. Yani, hatanum bir yan etki barındırmamalıdır. En iyisi hatanum değerinin basit bir değişken başvurusu olmasıdır; doğrudan errno vermek daha iyi olacaktır.
Bu makro bir GNU oluşumudur.
| Kullanım Bilgisi: |
---|
assert oluşumu dahili kararlılığın saptanması için tasarlanmıştır. Yazılımın kullanıcı tarafından yanlış kullanımının ya da geçersiz girdilerinin bildirilmesi için kullanışlı değildir. |
assert ve
assert_perror tarafından basılan tanı iletilerinden elde edilen bilgiler size yani yazılımcıya yöneliktir. Bir yazılım hatası ile ilgilidir. Kullanıcıya girdilerinin neden geçersiz olduğunu ya da neden bir komutun gerçekleştirilemediğini bildirmek için değildir. Neden yazılımınız, kullanıcının yaptığı bir hatadan dolayı
assert işlevinin yaptığı şekilde (bir yazılım hatası vererek) sonlansın ki. Bkz.
Çıkış Durumu.
Yazılımınızdaki bir yazılım hatasının sonucu
olmayan sorunlarda hata iletilerinin basılması ile ilgili bilgileri
Hata İletileri bölümünde bulabilirsiniz.