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

תוכן שנמחק תוכן שנוסף
ShoobyD (שיחה | תרומות)
Johnny Zoo (שיחה | תרומות)
אין תקציר עריכה
שורה 21:
==הגדרת קבוע==
 
אפשר להשתמש בקדם-מעבד כדי להגדיר קבועים. לדוגמה, אפשר לקבוע שהקבוע RED הוא 1 (מיד נראה כיצד). כאשר הקדם-מעבד יגיע לרצף האותיות RED, הוא יחליף זאת ב1ב-1.
 
 
לדוגמה:
שורה 33 ⟵ 32:
</source>
והמהדר כמובן יהפוך זאת לקוד שמדפיס 1.
 
 
===הגדרת קבוע בקוד===
 
מגדירים קבוע בקוד כך:
<source lang = "c">
שורה 542 ⟵ 539:
</source>
 
==סכנות==
שימוש ביכולות הקדם-מעבד מספק כמה יכולות רבות עוצמה, אך מצד שני - טומן בחובו לא מעט סכנות. ראו לדוגמה את המאקרו התמים הבא:
<source lang="c">
#define MY_FOO(x) x * x
</source>
כעת חשבו על קטע הקוד הבא, אשר עושה שימוש במאקרו:
<source lang="c">
int foo(int x, int y) {
return MY_FOO(x + y);
}
</source>
אחרי מעבר הקדם מעבד, תהייה התוצאה:
 
<source lang="c">
int foo(int x, int y) {
return x + y * x + y;
}
</source>
תוצאה בלתי מתוכננת!
 
על בעייה זו אפשר להתגבר בעזרת שימוש בסוגריים, כלומר:
<source lang="c">
#define MY_FOO(x) ((x) * (x))
</source>
האמנם הצלחנו לכתוב קוד בטוח? מה יקרה במקרה הבא?
<source lang="c">
int x = 3;
MY_FOO(++x)
</source>
האופרטור ++ יתבצע פעמיים (במקום, כפי שרצינו, פעם אחת), וגם כאן יביא לתוצאה שאינה מתוכננת (ולפעמים קשה מאוד למציאה!).
 
המסקנה משתי דוגמאות אלו היא שחובה לנהוג זהירות רבה לפני שימוש במאקרו.
 
{{שפת C|מוגבל}}