08.11.2014 Views

c_kitap

c_kitap

c_kitap

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

C ve Sistem Programcıları Derneği - C Ders Notları - Necati Ergin<br />

assert Makrosu<br />

assert, program geliştirirken programcının geliştirme süreci içinde bir takım olası<br />

böcekleri farketmesi için kullanılan bir makrodur. C'nin standart başlık dosyalarından<br />

assert.h içinde tanımlanmıştır. assert makrosu, makroya argüman olarak bir ifadenin<br />

verilmesiyle kullanılır. Örneğin:<br />

assert(p != NULL);<br />

Ayraç içindeki ifade, doğru olduğu ya da doğru olması gerektiği düşünülen bir durum<br />

belirtir. assert makrosuna verilen ifadenin sayısal değeri sıfır dışı bir değerse, yani<br />

sınanan önerme doğruysa, assert makrosu hiçbir şey yapmaz. Ancak makro ifadesinin<br />

değeri sıfırsa, yani ifadeye konu önerme mantıksal olarak yanlış ise assert makrosu<br />

standart abort() işlevini çağırarak programı sonlandırır.<br />

abort işlevi tıpkı standart exit() işlevi gibi çağırıldığı zaman programı sonlandırır. Ancak<br />

exit işlevinin yaptığı bir takım geri alma işlemlerini abort işlevi yapmaz. abort işlevi<br />

programı sonlandırdığında stdout akımına "Abnormal program termination" yazısını<br />

basar. assert makrosu başarısız olduğunda abort işlevini çağırmadan önce doğruluğu<br />

sınanan ifadeyi ve assert işleminin hangi dosyada ve satırda olduğu bilgisini ekrana<br />

yazar:<br />

#include <br />

#include <br />

int main()<br />

{<br />

int x, y;<br />

printf("iki sayi giriniz : ");<br />

scanf("%d%d", &x, &y);<br />

assert(y != 0);<br />

printf("%d / %d = %d\n", x, y, x / y);<br />

}<br />

return 0;<br />

Yukarıdaki programı inceleyin. Klavyeden y değişkenine girilen değer 0 ise, assert<br />

makrosuna verilen ifade yanlış olduğundan, program abort işlevinin çağrılmasıyla<br />

sonlandırılır. Programı çalıştırarak, program sonlandırıldığında ekrana basılan yazıyı<br />

inceleyin.<br />

assert, assert.h dosyası içinde aşağıdakine benzer biçimde tanımlanmış bir makrodur.<br />

#ifndefNDEBUG<br />

#define assert(exp)if(!(exp)){fprintf(stderr,"Assertion failed: %s,file<br />

%s, line %d\n",\<br />

#exp, __FILE__, __LINE__);abort();}<br />

#else<br />

#define assert(exp)<br />

#endif<br />

Bu makro şunları yapar:<br />

Eğer programcı assert.h dosyasının içeriğinin boşaltıldığı yerden daha yukarıda olan<br />

kaynak kod alanı içinde NDEBUG simgesel değişmezini tanımlamamışsa bütün assert<br />

makroları yerine kontrol kodları yerleştirilir. Kontrol kodu görüldüğü gibi ifadenin sayısal<br />

değeri sıfır ise abort işlevi ile program sonlandırılır. Eğer programcı assert.h dosyasının<br />

eklenmesinden önce NDEBUG simgesel değişmezini tanımlamış ise görüldüğü gibi bütün<br />

503

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!