C++/שלום עולם!
נתחיל מהצגת תכנית שלום עולם!, כנהוג להתחיל ספרים על שפות תכנות:
#include <iostream>
using namespace std;
int main()
{
std::cout << "Hello, world!\n";
return 0;
}
הסבר
[עריכה]תיקון לקוד שמופיע למעלה: על מנת שהתכנית תיעצר ותראה את הפלט באמצעי פלט הטקסט, צריך להוסיף לפני ה- ";return 0" שורה שעוצרת את התכנית כדי שנוכל לראות את הכתוב. שורות שניתן להוסיף לקוד הן: ";()cin.get" או ";("system("Pause" במקרה של השורה השנייה שמוצעת, יופיע המשפט "Press any key to continue..."
זהו קוד מקור של תכנית פשוטה, שכל מטרתה היא לפלוט באיזשהו אמצעי פלט את הטקסט "Hello, world!"
.
נסביר את הקוד בפרטים:
- הפקודה
#include
היא פקודה לקדם־מעבד (pre-processor), כך הן כל הפקודות המתחילות בסולמית. קדם־מעבד הוא חלק מהמהדר, והוא מורץ בתחילת תהליך ההידור. פקודת ה־include מורה לקדם־מעבד להדביק את תוכן הקובץ ששמו נכתב אחרי הפקודה, לתוך המקום בו נכתבה הפקודה עצמה. משתמשים בפקודה זו על מנת להכליל את ההצהרות של הספרייה בה אנו רוצים להשתמש, במקרה שלנו "iostream".
- iostream היא חלק מהספרייה התקנית של C++ האחראית על קלט ופלט (Input/Output Stream). כל הספריות התקניות יבואו בסוגריים משולשים לאחר פקודת ה־include, זאת כדי שהמהדר ימצא את הקובץ לבד. במקרה של הספריה התקנית של C++, לאו דווקא קיים קובץ כזה על הדיסק הקשיח שלכם, דבר זה תלוי בסביבת הפיתוח בה אתם עובדים.
- השורה
int main()
פותחת את הגדרת פונקציית main, זוהי השורה שממנה תתחיל להתבצע התוכנית. הסוגריים המסולסלים פותחים וסוגרים בלוק של פקודות שתתבצענה בזמן הרצת התוכנית, כל השורות הנמצאות מחוץ לסוגריים אלה, משמשות אותנו רק בזמן ההידור. את הפרטים על פונקציות תלמדו בהמשך.
- הסימן >> משמעותו "פלוט את מה שמימין לתוך מה שמשמאל". במקרה שלנו אנו פולטים את המחרוזת (טקסט) "Hello, world!" לתוך ה־stream ששמו std::cout. שימו לב שמשמעות סימן זה יכולה להשתנות ממקום למקום בהתאם למה שנכתב מימין ומשמאל (ראו העמסת אופרטורים).
- השם std::cout מורכב משני חלקים: הראשון (std) מציין את מרחב השם של הספריה התקנית, ואילו החלק השני (cout) הוא שם של עצם הנמצא בתוך מרחב שם זה. בקצרה ניתן לסכם זאת כך: אנו פולטים לתוך עצם cout התקני.
- העצם cout מוגדר בספרייה iostream, ולשם השימוש בו הכללנו אותה בשורה הראשונה. כאשר אנו פולטים לתוך העצם cout, הפלט נשלח לאיזשהו אמצעי פלט במערכת. ברוב המערכות אמצעי פלט זה הוא המסך, כברירת מחדל. אם תריצו תוכנית זו, כנראה גם במערכת שלכם תראו את המילים "Hello, world!" מוצגות בחלון/מסך טקסט (ידוע בשם קונסולה).
- את המחרוזות (טקסט) ב־C++ נכניס לתוך גרשיים על מנת להבדיל משאר הקוד הניתן לביצוע. שימו לב שהגרשיים לא יופיעו בפלט. שני הסימנים האחרונים במחרוזת n\ מייצגים תו אחד הנקרא "ירידת שורה" (Line Feed או New Line). מקור התו הזה, ועוד תווים שונים אחרים, הוא בתחילת הסטוריית המדפסות שלא נספר עליה כאן. במקרה שלנו אנו מורידים את סמן הפלט לשורה חדשה, כך שכל הפלט הבא (שאיננו כאן) יופיע בשורה הבאה.
- מטעמי נוחות ותאימות למערכות אחרות, נהוג לפעמים להשתמש בכתיב std::endl לירידת שורה (ראה דוגמה למטה). כתיב זה כמעט זהה בפעולתו לזה שבתוכנית המוצגת כאן.
- ההוראה
return 0;
מחזירה את הערך 0 למערכת, ערך זה מסמל סיום תוכנית מוצלח. כל ערך השונה מאפס מסמל שגיאה בזמן ריצת התוכנית. הוראה זו הכרחית בכל הפונקציות שמחזירות ערך, חוץ מפונקציית main, אומנם בשל האחידות רבים כותבים אותה גם כאן.
- כל הוראה ב־C++, מלבד הוראות הבקרה, תסתיים בנקודה־פסיק ולא בסוף שורה (כמו בחלק מהשפות), כך נוכל לפרק הוראות ארוכות למספר שורות.
בנייה והרצה
[עריכה]כדי ללמוד לתכנת יש להריץ את התוכניות שנכתבו (על אף שבמקרים מסויימים כתיבת קוד היא אך ורק פעילות תיאורטית). לצורך זה תצטרכו להדר אותן באמצעות מהדר וכאשר אתם תכתבו תוכניות גדולות שתתפוסנה יותר מקובץ אחד תצטרכו גם לקשר באמצעות מקשר.
ניפוי השגיאות הוא חלק בלתי נפרד מפיתוח תוכנות גדולות. העדר אפשרות הרצת התוכנית תחת מנפה שגיאות, במערכות זמן אמת לדוגמה, מקשה על פיתוח תוכנות אלה. מנפה שגיאות טוב יכול לתרום לכם להבנה של אופן פעולת התוכנית; הוא מאפשר להריץ קטעים שמתבצעים במשך כמיקרון השנייה, שורה אחר שורה.
בהתאם למערכת שבה אתם עובדים תצטרכו ללמוד להשתמש בכלים הקיימים בה.
פרק זה לוקה בחסר. אתם מוזמנים לתרום לוויקיספר ולהשלים אותו. ראו פירוט בדף השיחה.
g++ בלינוקס ו-Cygwin
[עריכה]כדאי לדעת: מהדר ה־g++ הוא מהדר C++ נפוץ למגוון פלטפורמות. |
השימוש במהדר g++ זהה כמעט לחלוטין לשימוש במהדר ה־gcc (כאשר במקום gcc כותבים g++), ומי שכבר למד להשתמש בו יכול לדלג על חלק זה.
כדי להדר תוכנית משורת הפקודה, כותבים את השורה הבאה:
g++ myprogram.cpp
הפקודה תיצור קובץ הרצה בשם a.out
, או תדפיס הודעות שגיאה מתאימות.
כדי להדר כמה קבצים ביחד, כותבים אותם בשורה, בזה אחר זה:
g++ prog1.cpp prog2.cpp prog3.cpp
הפקודה תיצור קובץ הרצה המורכב מכל הקבצים יחד. בצורה זו, ניתן ליצור תוכנית מכמה קבצים שונים.
כדי לשלוט בשם קובץ ההרצה הנוצר, נשתמש בדגל -o
, בצורה הבאה:
g++ myprog.cpp -o Program
אם נרצה רק להדר קובץ, אך עדיין לא ליצור ממנו קובץ הפעלה, נשתמש בדגל -c
:
g++ -c myprogram.cpp
פקודה זו תיצור קובץ בשם myprogram.o
, שאינו קובץ הרצה, אך ניתן לקשר אותו עם קבצים אחרים. נניח, למשל, שהתוכנית שלנו כוללת את הקבצים prog1.cpp, prog2.cpp ו-main.cpp, אז ניתן להדר אותה בעזרת רצף הפקודות:
g++ -c prog1.cpp
כפי שראיתם, ניתן להדר קבצי .o וקבצי .cpp יחד. הסיבה היא שפעולת הקישור - יצירת התוכנית הכוללת, ופעולת ההידור, הן שתי פעולות נפרדות.
דגל נוסף שכדאי להכיר הוא
g++ -c prog2.cpp
g++ main.cpp prog1.o prog2.o -o Program-Wall
. דגל זה מורה למהדר לכתוב כל הודעת אזהרה אפשרית, ובכך מסייע רבות בזיהוי בעיות אפשריות. לכן, כדי להדר את התוכנית שכתבנו, בהנחה ששמרנו אותה בקובץ hello.cpp, נשתמש בפקודה הבאה:
g++ -Wall hello.cpp -o Hello
כתוצאה מכך, יווצר קובץ הרצה בשם Hello בתיקיה בה אנו עובדים. ניתן להריץ את הקובץ ולקבל את פלט התוכנית.
סביבת פיתוח בחלונות
[עריכה]כדאי לדעת: ברוב סביבות הפיתוח בחלונות, הרצת תוכנית כזו תפתח חלון אשר ייסגר מיד לאחר סיום התכנית, דבר שעלול להקשות על קריאת הפלט. אם הדבר אכן קורה, אפשר להוסיף שתי שורות לקוד, שיראה עתה כך:#include <iostream>
#include <stdio.h>
int main()
{
std::cout << "Hello, world!\n";
getchar();
return 0;
}
לאחר הוספת שורות אלו, החלון יישאר פתוח עד שתקישו על מקש כלשהו. כך תוכלו לראות את הפלט לפני שהחלון ייסגר. |
אם אתם משתמש ב־Microsoft Visual Studio, תוכלו לפעול לפי הצעדים הבאים. על אף שקיימים הבדלים בין גרסות שונות, הם אינם משמעותיים. בגרסה 2005 ניתן לעשות זאת כך:
- מיזם חדש – כנסו לתפריט File → New → Project.... מצאו תחת קטגוריה "Visual C++" את סוג המיזם "Win32 Console Application" ובחרו אותו. הזינו שם למיזם ואת המסלול בו תיווצר התיקיה של המיזם. ניתן להוריד את הסימון "Create Directory for Solution", על מנת שתיווצר תיקייה אחת פחות. לחצו על OK. באשף שיפתח, עברו ל־Application Settings או לחצו על Next. בחלון זה סמנו את "Empty project" וסיימו עם לחיצת Finish. כעת נוצרה לכם תיקייה במסלול שהזנתם עם שם המיזם ובה קבצים של המיזם; כרגע הוא ריק.
- יצירת קובץ C++ חדש – כדי ליצור קובץ C++ חדש, כנסו לתפריט Project → Add New Item.... מהחלון שנפתח בחרו את סוג הקובץ "C++ File" והזינו את שם הקובץ (לדוגמה main.cpp), מותר להזין את שם הקובץ גם ללא הסיומת, היא תתווסף אוטומטית.
- הוספת קובץ C++ קיים – כדי להוסיף קובץ C++ קיים, רצוי תחילה להעתיקו לתיקיית המיזם. לאחר מכן יש לבחור מהתפריט Project → Add Existing Item.... בחלון שיופיע, יש לבחור את הקבצים שברצונכם להוסיף.
- עריכת קוד – על מנת לערוך את אחד מקבצי המיזם, יש ללחוץ עליו פעמיים בחלון "Solution Explorer".
- הידור והרצה – כדי לבנות את המיזם (להדר ולקשר), יש לבחור את Build → Build Solution. אם ההידור יעבור בהצלחה יווצר קובץ הרצה בתיקיית Debug בתוך תיקיית המיזם. כדי להריץ תחת מנפה שגיאות יש לבחור את Debug → Start Debugging. אם יהיו שגיאות בזמן ההידור, הן תופענה בחלון Output או Task List. לחיצה כפולה על שגיאה תביא אתכם לשורה בה הייתה השגיאה.
לא צוינו כאן קיצורי המקשים, מכיוון שהם יכולים להשתנות. כמו כן תוכלו לשנות את ההגדרות (אם הן עדיין לא כאלה) כך שהמיזם יהודר אוטומטית בכל פעם כשאתם מריצים (לרוב על ידי מקש F5). במקרה זה, כדאי להגדיר כך שלא תורץ הגרסה האחרונה שהודרה במקרה שהיו שגיאות הידור בגרסה חדשה.
כברירת מחדל, מהודרת גרסת Debug של המיזם. בגרסה זו, המהדר אינו עושה ייעול; בנוסף, הוא משאיר מידע נוסף בקובץ ההרצה החיוני למנפה שגיאות, דבר המגדיל מעט את קובץ ההרצה. כאשר תרצו להדר גרסה סופית של המיזם (למשל, כדי להפיצו), תוכלו לבחור ב־Release במקום Debug (בתוך תיבה על סרגל הכלים הראשי).
כאשר תרצו להקטין את נפח המיזם (למשל, כשתגבוהו או תשלחוהו במייל), תוכלו לנקותו מתפריט Build → Clean Solution או למחוק ידנית את תיקיות ה־Debug וה־Release ואת הקבצים עם הסיומות: ncb, suo, user, aps (תחילה יש לסגור את סביבת הפיתוח).
Dev C++
[עריכה]Dev C++ היא תוכנת קוד פתוח לפיתוח ב C\C++. ניתן להוריד אותה מכאן.
בגרסה 4.9.9.2 ניתן לפעול כך:
- מיזם חדש - כנסו לתפריט File → New → Project. מצאו תחת הכרטיסייה "Basic", את סוג המיזם "Empty Project" ובחרו אותו. בחרו "C++ Project", ואף רצוי לסמנו כשפת ברירת המחדל ע"י סימון התיבה "Make Default Language". לחצו Ok לאישור. נפתח לכם חלון בו תוכלו לבחור היכן לשמור את המיזם ואת שמו. בחרו תיקייה ולחצו Save לסיום. כעת נוצר לכם קובץ מיזם בעל סיומת .dev בתיקייה בה בחרתם לשמור את המיזם.
- יצירת קובץ C++ חדש - ליצירת קובץ C++ חדש בחרו בתפריט Project → New file. כעת נפתח לכם דף בו תוכלו לכתוב את התוכנית שלכם.
- הוספת קובץ C++ קיים – כדי להוסיף קובץ C++ קיים, רצוי תחילה להעתיקו לתיקיית המיזם. לאחר מכן יש לבחור מהתפריט Project → Add to Project. בחלון שיופיע, יש לבחור את הקובץ שברצונך להוסיף.
- עריכת קובץ - על מנת לערוך אחד מקבצי המיזם, לחצו עליו לחיצה כפולה בכרטיסייה "Project" שבצד שמאל.
- הידור והרצה - על מנת להדר ולהריץ את התוכנית, בחרו בתפריט Execute→ Compile & run. בהרצה הראשונה תוכלו לבחור את שם קובץ ההרצה ואת מיקום שמירתו. על מנת להריץ בלבד מבלי להדר את כל התוכנית שוב, בחרו בתפריט Execute → run. הרצה בלבד תוכל להתבצע רק לאחר שהתוכנית הודרה לפחות פעם אחת. אם ההידור עבר בהצלחה, נוצר לכם בתיקיית המיזם קובץ בשם שבחרתם עם סיומת .exe אותו תוכל להריץ ישירות מהמחשב. אם ישנן שגיאות, הן תופענה לכם בחלון בתחתית התוכנה. לחיצה כפולה על שגיאה תביא אתכם לשורה בה הייתה השגיאה.
לא צוינו כאן קיצורי המקשים, מכיוון שהם יכולים להשתנות בגרסאות הבאות, לכשיצאו כאלה.
סביבות פיתוח אחרות
[עריכה]השתמשו בסביבת הפיתוח שלכם בכדי להדר את הקוד. אם ההידור יעבור בהצלחה, יווצר קובץ מתאים בעל סיומת .exe אשר יהיה ניתן להריצו.
פרק זה לוקה בחסר. אתם מוזמנים לתרום לוויקיספר ולהשלים אותו. ראו פירוט בדף השיחה.
סגנון הקוד בהמשך הספר
[עריכה]using namespace
כאשר כותבים ב++C יש לציין את שם הספרייה בה משתמשים לפני שימוש בכל אחת מהמתודות שלה. כתיבת הקידומת std:: לפני כל פנייה לכלים מהספרייה התקנית, לא נוחה. בתוכניות קטנות בהן אין בעייה של עומס שמות, משתמשים לרוב במשפט using namespace std
. משפט זה מציין למהדר שאנחנו נפנה לשמות של הספרייה התקנית ללא הקידומת std::. ברוב קטעי הקוד בספר לא נוסיף קידומת זו:
#include <iostream>
using namespace std;
int main()
{
cout << "Hello, world!" << endl;
return 0;
}
זו דוגמה לדברים שנאמרו לעיל: אין כאן תוספת ה־std::, והשתמשנו ב־endl. שימו לב כיצד שרשרנו את הפלט באמצעות מספר אופרטורי ה־>>.
כמו כן, לרוב לא נכתוב תוכניות שלמות, אלא רק קטעי קוד קצרים:
cout << "Here is a \" quote." << endl;
כדי להדר קטעים אלה תצטרכו להוסיף אותם לתוך פונקציית main ולהכליל את הספריות המתאימות.
הזחות
דבר סגנוני נוסף הוא ההזחות שבקוד. הזחה היא הוספת רווחים בתחילת השורה, לרוב משתמשים בטאבים לצורך זה. גודל הטאב הנפוץ בקרב מתכנתי C++, הינו 4 רווחים, כמו כן מתכנתים אחרים יכולים להעדיף גם אורך אחר, לדוגמה 2 רווחים מקובלים בתכנות בסביבות פיתוח טקסטואליות. ב־C++ אין שום משמעות לרווחים בעיני המהדר אבל היתרון בהוספת רווחים במקום זה או אחר הוא שיפור הקריאות של הקוד. מוסכמה גורפת בקרב המתכנתים (גם בשפות אחרות) היא שקוד הנמצא בתוך בלוק פקודות (בין סוגריים מסולסלים ב־C++) יוזח ימינה מעט יותר מהבלוק בו הוא נמצא. לגבי הימצאות הסוגריים עצמם, רווחים בתוך ביטויים או רווחים אחרי משפטי בקרה – אין כללים.
הערות
[עריכה]הערה בקוד מקור של שפת תכנות היא קטע מהקוד שהמהדר מתעלם ממנו. הערות נכתבות בעיקר כדי להקל על קריאת הקוד על ידי אדם. במקרים נדירים הערות משמשות עבור תוכנות אוטומטיות לכתיבת קוד, לדוגמה אשפים. כמו כן בעת כתיבת הקוד וניפוי השגיאות נוח "לכבות" מספר שורות שלא תתבצענה, במקרה כזה מכניסים אותן לתוך הערה כך שהמהדר יתעלם משורות אלה.
ב־C++ קיימות שתי סוגי הערות:
- אלה הנמשכות עד לסוף השורה. מתחילים את ההערה ב: // (שני קווים נטויים).
- אלה הנפרסות על מספר שורות. מתחילים אותן בכל מקום ב: /* (קו נטוי וכוכבית) ומסיימים ב: */ (כוכבית וקו נטוי).
לדוגמה:
/* This code demonstrates
the type of comments in
C++ */
#include <iostream> // For std::cout
using namespace /* A comment in the middle of a line */ std;
// Here the program starts execution.
int main()
{
cout << "Hello, world!\n";
return 0;
}
בספר זה נשתמש בהערות מהסוג: /* ... */ ו־// ... כדי לסמן בקוד שבמקום זה נמצא קוד שלא נכתב. זאת כדי לא לחזור על אותו קוד משני שכבר נזכר למעלה פעמים נוספות וגם כאשר במקום זה נוכל לכתוב כל קוד שהוא.
קישורים חיצוניים
[עריכה]- אוסף כללים סגנוניים לכתיבת קוד עם טענות בעד ונגד: http://c2.com/cgi/wiki?SelfDocumentingCode.
הפרק הקודם: מבוא |
שלום עולם! תרגילים |
הפרק הבא: משתנים |