שפת C/הקדם מעבד: הבדלים בין גרסאות בדף

תוכן שנמחק תוכן שנוסף
Johnny Zoo (שיחה | תרומות)
Atavory (שיחה | תרומות)
שורה 294:
assert(<cond>);
</source>
כאשר cond הוא [[שפת C/ערכים בוליאניים ותנאים|ערך בוליאני]].

<source lang = "c">
assert(x != 0);
</source>
אם התנאי אינו מתקיים - התוכנית נעצרת, ומודפסת הודעה שהתנאי המסויים לא התקיים:
<source lang = "c">
{{פלט|Assertion failed: ''assertion'', file ''filename'', line ''number''}}
Assertion failed: 'x != 0' in line 80 test.c
</source>
 
<source lang = "c">
void foo(int x)
{
assert(x != 0);
float y = 1.0 / x;
...
}
</source>
 
<source lang = "c">
void foo(int x)
{
if(!(x != 0))
{
printf("Assertion failed: 'x != 0' in line 80 test.c");
exit(-1);
}
float y = 1.0 / x;
...
}
</source>
 
<source lang = "c">
void foo(int x)
{
float y = 1.0 / x;
...
}
</source>
 
עם הנתונים המתאימים. המאקרו assert מאפשר לדעת בצורה נוחה האם תנאי מסויים שאנו מניחים שהוא מתקיים - אכן מתקיים. אפשר אף להוסיף את השורה
<source lang = "c">
assert(0);
</source>
 
<source lang = "c">
switch(b)
{
case 1:
...
case 3:
...
case 15:
...
default:
assert(0);
};
 
...
</source>
במקומות אליהם לא אמורה התוכנית להגיע. אם תגיע לשם התוכנית - היא תעצור באופן מיידי. כדאי להתרגל לשימוש ב-assert, כיוון ששימוש תכוף בו יביא לגילוי מוקדם של תקלות רבות. היתרון בהיותו של assert מאקרו נעוץ באפשרות לבטל אותו: אם מהדרים את התוכנית עם [[שפת C/הקדם מעבד#קבועים מקובלים|הקבוע NDEBUG]], הוא הופך לביטוי ריק על ידי הקדם-מהדר, ולמעשה - נעלם, בלי שהיה צורך לשנות את הקוד. נראה דוגמה לשימוש בו ב[[שפת C/הקדם מעבד#דוגמה לקוד לניפוי שגיאות|דוגמה לקוד לניפוי שגיאות]].