דף הבית שיעורים תוספות לא מונחות עצמים
הפחתת השימוש ב-define
 
הפחתת השימוש ב-define
 
ב-C משתמשים במילה define רבות. היא משמשת למגוון פעולות כגון הגדרת קבועים והגדרת פונקציות פשוטות. לדוגמא:

#define double_it(a) a*2
#define platform Windows
#define debug_mode
העבר את העכבר על שורות הקוד בכדי לקבל הסבר מפורט

אך למרות שימושיות הפקודה, קיימות בעיות רבות העולות בעת השימוש בה. לדוגמא, השימוש הבא למאקרו double_it ייתן תוצאה שגויה:

a = double_it(5+3);
העבר את העכבר על שורות הקוד בכדי לקבל הסבר מפורט

שגיאות כאלו קל לעשות, אך קשה מאד לעיתים לאתרן.
כתוצאה ממגוון הבעיות הכרוכות בשימוש ב-define, ל-++C נוספו מספר חידושים שיאפשרו הפחתת שימוש ב-define.
אחד החידושים הללו הוא נושא שכבר דנו בו, פונקציות inline, המספקות דרך להרוויח את יעילות המאקרו, ללא הבעיות הכרוכות בשימוש בו.
שינוי נוסף, המאפשר להשתמש ב-define פחות, הוא הרחבת השימוש במילה השמורה const. const היא מילה הקיימת גם ב-C, אך נחשבת לאחד החלקים הפחות שימושיים ב-C. דוגמא לשימוש במילה const ב-C הוא הפונקציה הבאה המקבלת int כפרמטר:

void Sample(int a)
{
 a = 5;
}
העבר את העכבר על שורות הקוד בכדי לקבל הסבר מפורט

כידוע, שינוי ערך המשתנה a הוא חוקי בהחלט, כל זמן שאתה מודע לכך שאתה משנה ערך של שכפול של המשתנה ולא את ערכו של המשתנה המקורי אותו העברת בקריאה לפונקציה.
ניתן, במצב זה, להוסיף את המילה const למשתנה (לפני או אחרי טיפוס המשתנה):

void Sample(int const a)
{
 a = 5;
}
העבר את העכבר על שורות הקוד בכדי לקבל הסבר מפורט

תוספת זו מיידעת את המהדר שאינך מתכוון לשנות את הפרמטר הזה. במקרה זה, המהדר יתייחס לפעולת ההשמה ל-a כאל שגיאה.כלומר, ב-C המילה const מזהה את הפרמטר כקבוע שאינו יכול להשתנות.
ב-++C המילה const יכולה לשמש במקרים רבים נוספים.
לדוגמא, בקטע הקוד הבא, מגדירים משתנה גלובלי עם המילה const:

int const pathSize = 512;
char path[pathSize];
העבר את העכבר על שורות הקוד בכדי לקבל הסבר מפורט

פעולה זו מיידעת את המהדר על כך שמשתנה זה הוא קבוע ואין בכוונתנו לשנות את ערכו. כעת ניתן להשתמש בו בכל מקום שבו משתמשים בערך מספרי רגיל.
אם היית רוצה היית משיג את אותה פעולה ע"י שימוש בפקודת define, כמו כאן:

#define pathSize 512;
char path[pathSize];
העבר את העכבר על שורות הקוד בכדי לקבל הסבר מפורט

ניתן להשתמש במתודה זו גם ב-C וגם ב-++C, אך היתרון של המתודה הקודמת הוא, שהיא לא נאלצת להשתמש בפקודת define.