שפת C/הקדם מעבד: הבדלים בין גרסאות בדף
תוכן שנמחק תוכן שנוסף
שורה 381:
</source>
אך יש מספר בעיות עם פתרון זה:
*הקוד הופך להיות פחות יעיל, מפני שאם אכן x לעולם אינו 0 - ביצענו בדיקה מיותרת.
*הקוד מסורבל יותר; קשה יותר להבין מה הפונקציה עושה.
*אם נעביר את הקוד לקובץ אחר או לשורה אחרת - הודעת השגיאה המודפסת סתם תבלבל.
כדי לפתור זאת, נוכל להשתמש ב[[#התניה באי-הגדרת קבוע|התניה באי-הגדרת קבוע]] וב[[#קבועים מקובלים|קבועים מקובלים]], כך:
<source lang = "c">
void foo(int x)
שורה 388 ⟵ 392:
if(!(x != 0))
{
printf("Assertion failed: 'x != 0' in line
exit(-1);
שורה 399 ⟵ 403:
}
</source>
אך הקוד הופך להיות אפילו יותר מסורבל.
כעת נראה איך להשתמש במאקרו assert להשגת אותה התוצאה, אך בפחות סרבול.
===השימוש במאקרו===
<source lang = "c">▼
printf("Assertion failed: 'x != 0' in line 80 test.c");▼
...▼
}▼
</source>▼
משתמשים במאקרו assert בצורה הבאה:
<source lang = "c">
assert(<cond>);
</source>
כאשר cond הוא [[שפת C/ערכים בוליאניים ותנאים|ערך בוליאני]]. לדוגמה, אפשר לכתוב כך:
<source lang = "c">
assert(x != 0);
</source>
אם התנאי
<source lang = "c">
Assertion failed: 'x != 0' in line 80 test.c
</source>
ותעצר.
אם יש שורה שלעולם אין להגיע אליה, אפשר לכתוב:
<source lang = "c">
assert(0);▼
▲</source>
אם בכל אופן התוכנית תגיע לשורה אי פעם (כלומר - יש טעות בקוד), התוכנית תדפיס הודעה כזו:
▲<source lang = "c">
...▼
</source>
ותעצר.
===דוגמאות===
נוכל להשתמש במאקרו כדי לפתור את הבעיה הקודמת שראינו:
<source lang = "c">
void foo(int x)
{
float y = 1.0 / x;
שורה 465 ⟵ 449:
</source>
לפעמים גם מוסיפים את המאקרו ב[[שפת C/ערכים בוליאניים ותנאים#switch-case|switch-case]] שלא אמור לקבל ערך ברירת-מחדל לעולם. לדוגמה, נתבונן בקטע הבא:
<source lang = "c">
switch(b)
{
case 1:
...
case 3:
▲ ...
case 15:
▲ ...
▲};
...
▲assert(0);
</source>
קטע הקוד עשוי להתאים למצב בו b אמור לקבל בדיוק אחד משלושת הערכים 1, 3, ו15. במקרה זה, נוכל להוסיף את החלק הבא:
<source lang = "c">
switch(b)
שורה 494 ⟵ 479:
...
</source>
כך, אם אירעה שגיאה בקוד, נקבל הודעת שגיאה מתאימה.
==דוגמה לקוד לניפוי שגיאות==
|