למה להשתמש בconst ולא בdefine ?

BeyondTheWall

New member
למה להשתמש בconst ולא בdefine ?

אני סתם תוהה, הרי define יחסוך קצת משאבים לאחר בניית התוכנית, ואני לא מצליח לחשוב על מצב בו const יעשה משהו שdefine לא יכול... o_O אני יודע שזאת שאלה מאד מוזרה, ובוודאי גם טיפשית, אבל מאוחר ... עוד שאלה לא קשורה : אם אני עובד בתוכנית מסוימת (לא OOP) הרבה עם מערך מסויים, עם מבנה אחר, האם להגדיר אותו כגלובאלי ואז לתת לפונקציות לטפל בו מבלי שאצטרך כל פעם לטרוח ולהעביר אותו לכל פונקציה או שלא ? כי שמעתי הרבה פעמים "אף פעם לא להשתמש במשתנים גלובאליים" ואני לא מוצא סיבה מדוע ... אני מזכיר שוב שמאוחר. תודה.
 

BeyondTheWall

New member
2 תיקונים קלים :

*עם מערך מסויים, או מבנה אחר * - אני מודע לעובדה שכשאני מעביר מערך לפונקציה אני מעביר מצביע אליו, השיקול שעומד לפני הוא לא זה , אלא למה לטרוח כל פעם לקרוא לפונקציה עם נניח ארבעה פרמטרים במקום שלושה ...
 

vinney

Well-known member
ככה

כי const מקצה זכרון פעם אחת, אם אתה עושה define למשהו, אתה כל פעם מציב ערך - יותר פעולות, אם מדובר במשהו שהוא long והלאה - זה גם בזבוז זכרון. בנוסף, זה מקל על debug. ולא כדאי להשתמש במשתנים גלובליים באופן כללי, אבל במקרים מסוימים בתכנות פרוצדורלי זה יכול להיות בסדר. התנאים הם כך: 1. אתה מתכנת בודד על התוכנה, וזה תמיד ישאר ככה. 2. התוכנה שלך מתועדת כמו שצריך. 3. אתה לא מגדיר משתנים בקבצים שאתה עושה להם include (קבצי H) אם על משהו אחד ענית לא - אסור להשתמש במשתנים גלובליים, אחרת - סתם לא מומלץ.
 
לא נכון מה שאמרת לגבי define

מקרו כשלעצמו לא מקצה זיכרון. גם אם מדובר ב long הקומפיילר ייתן את אותו פלט בין אם זה define ובין אם זה const לטיפוסים אורדינליים ולמיטב ידיעתי גם לנקודה צפה. מה שאמרת נכון עבור מחרוזות. יותר נכון להשתמש ב const בקובץ cpp למשל:
static const char* Error_Message = "No such file or directory"; Vs #define Error_Message "No such file or directory"​
כאן בכל שימוש של המזהה Error_Message המקרו ישתול את המחרוזת ואז יהיה שיכפול מחרוזות. יש קומפיילרים (ולינקרים) שמורידים duplicate strings שכאלה אבל זה לא מובטח. הסיבות מדוע לא להשתמש במקרו כאשר אין צורך, נוגעות יותר לתחזוקה של תוכנות וההתערבות של הפרה-פרוססור בטקסט של התוכנית ולא בפלט. הפלט של פונקציה inline או של מקרו, או const לעומת define אמור להיות זהה לחלוטין. זכור לי מקרה בעבודה שבו הסבנו קובץ h מ-define ל enum ומיד אחר ההמרה קיבלנו הרבה שגיאות קומפילציה בגלל שגיאות כתיב ישנות שהפרה-פרןססור לא תפס.
 

vinney

Well-known member
לא הבנת את מה שאמרתי

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