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

תוכן שנמחק תוכן שנוסף
Atavory (שיחה | תרומות)
Atavory (שיחה | תרומות)
שורה 322:
 
==המאקרו assert==
 
{{בעבודה}}
נתבונן בקטע הקוד הבא:
<source lang = "c">
void foo(int x)
{
float y = 1.0 / x;
...
}
</source>
קל לראות שתתרחש טעות אם x = 0 בזמן הקריאה, אך נניח שאנו יודעים שהפוקנציה foo לא תיקרא לעולם כאשר x = 0, כי חלקים אחרים בקוד דואגים לכך. מה יקרה אם יש שגיאה בחלקי הקוד הדואגים לכך? ברוב המערכות, התוכנית תיעצר, ותודפס הערה קצרה למדי. קשה יהיה להבין אפילו איזו שורה גרמה לטעות.
 
כדי להתמודד עם זאת, היינו יכולים לכתוב את הפונקציה כך (הנח ששם הקובץ הוא {{משמאל לימין|test.c}}, והפונקציה כתובה באיזור שורה 80):
<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)
{
#ifndef NDEBUG
if(!(x != 0))
{
printf("Assertion failed: 'x != 0' in line 80 test.c");
exit(-1);
}
#endif /* #ifndef NDEBUG */
float y = 1.0 / x;
...
}
</source>
 
 
{{הארה|1 = קטעי הקוד שבנושא זה משתמשים בספרייה הסטנדרטית. נדון בספריות באופן מעמיק יותר [[שפת C/שימוש בספריות|כאן]]. לעת עתה, פשוט יש לזכור לרשום בראשי הקבצים המשתמשים בקטעי הקוד שבנושא זה {{קוד|#include <assert.h>}} }}