מפתח שגיאות קומפילציה בשפות C/C++

כל שגיאה המתקבלת ע"י הקומפיילר מיוצגת ע"י קידומת ומספר מזהה, למשל:

         

כפי שניתן להבחין, לכל שגיאת קומפיילר יש ציור מקדים:

1] סימן קריאה במשולש צהוב: אלו רק אזהרות ואינן משפיעות על יכולת הרצת התוכנית. משמע ניתן להתעלם מהן אך כמובן מומלץ שלא.
2] איקס בעיגול אדום: שגיאות שמונעות את הרצת התוכנית ויש לתקנן, והן מתחלקות ל- 2 סוגים:
        א] שגיאות שהקידומת שלהן היא האות C: אלו שגיאות קומפילציה (Compilation, ולכן הקידומת C), והן מעידות על שגיאה תחבירית כלשהי בקוד. 
       ב] שגיאות שהקידומת שלהן היא LNK אלו שגיאות לינקר (LiNKer, ולכן הקידומת LNK), והן מעידות שהפורייקט עבר קומפילציה בהצלחה, כלומר אין שגיאות תחביר, אך ישנה בעיה בזימון הפוקציות (לרוב או שאין בכלל פונקצית main, או שהיא קיימת יותר מפעם אחת, או שישנו זימון לפונקציה שאין לה מימוש, ולרוב נובעת משגיאת כתיב - פירוט על כולן בהמשך).

 בסה"כ השגיאות של הקומפיילר מחולקות ל- 3 סוגים, וחשוב לדעת להבדיל ביניהן כדי להבין את חשיבות הבעיה ואת מקורה.

 בהמשך מסמך זה נסביר על שגיאות ספציפיות. במידה ונתקלתם בשגיאה שאינה מופיעה במסמך זה, מוזמנים לשלוח לי  למייל info@kerenkalif.co.il את מספר השגיאה ואת הפרוייקט, ואשמח להוסיף את ההסבר והפתרון למסמך זה.

שגיאות קומפילציה - (קידומת C)

שגיאות לינקר (קידומת LNK)

LNK2005


מה השגיאה אומרת?

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

הפתרון:
תבצעו בפרוייקט חיפוש למחרוזת main וכך תמצאו את כל פונקציות ה- main שהגדרתם. תשימו את כולן פרט לאחת בהערה ותקמפלו מחדש. 

LNK1168


 

מה השגיאה אומרת?
שהרצתם את התוכנית והקונסול השחור של הרצה קודמת עדיין פתוח. 

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


אזהרות (קידומת C עם משולש וסימן קריאה

C4326

מה האזהרה אומרת?
אזהרה זו נובעת כי הגדרתם את פונקצית ה- main כך:

 void main()
{
     /* ... */
}

 

כלומר שאינה מחזירה שום ערך (הטיפוס המוחזר של הפונקציה הוא void).
אם טרם למדתם פונקציות, ז"א שהמילה שמשמאל למילה main היא void.

הפתרון:
עפ"י התקן הרישמי המעודכן של השפה ישנה המלצה שפונקציית ה- main תחזיר מספר שלם המעיד על הצלחה או כישלון של ה- main, ולכן עדיף שה- main יכתב כך:
int main()
{
    /* ... */     
    return 0;
}
אם טרם למדתם פונקציות, נושא זה יובהר בהמשך, וכרגע כדי להימנע מאזהרה זו כיתבו את ה- main כמצוין לעיל.
ליצירת קשר, מלא/י פרטים: