3.7 הpreprocessor פתרון
שלב 1 – תרגול עם #define ו־#undef¶
- הגדירו מקרו בשם
PIעם הערך3.14. לאחר מכן חשבו את שטח מעגל בעזרתPI, למשל:
- בטלו את המקרו בעזרת
#undef PIלפני השימוש וראו שהקומפיילר מתלונן. נסו להריץ גם עם וגם בלי#undef.
שלב 2 – פונקציות מקרו¶
- הגדירו פונקציית מקרו בשם
MAX(a, b)שמחזירה את המספר הגדול מבין שניים. נסו להריץ אותה בקוד כמו:
#define MAX(a, b) ((a) > (b) ? (a) : (b))
int main() {
int x = 5, y = 9;
int m = MAX(x, y);
return 0;
}
- נסו להריץ
MAX(x++, y++)ובדקו מה קרה ל־x ו־y. תראו שהם הוגדלו יותר מפעם אחת — זאת בעיה נפוצה במקרו שמכפיל קוד.
שלב 3 – תנאים בקומפילציה¶
- הגדירו בקובץ
version.hאת הערךVERSION:
- בקובץ הראשי:
#include "version.h"
#if VERSION == 1
int config = 100;
#elif VERSION == 2
int config = 200;
#else
int config = 300;
#endif
שנו את VERSION ובדקו מה הערך של config.
שלב 4 – הגנות על קבצי Header¶
- כתבו קובץ
myheader.hכך:
- בקובץ
.c, כללו אותו פעמיים:
הקומפיילר לא יתלונן – הקובץ הוכלל רק פעם אחת בזכות ההגנה.
- נסו להחליף ל־
#pragma onceוראו שהתוצאה זהה.
שלב 5 – תנאים וסביבת קומפילציה¶
- כתבו את הקוד הבא:
#ifdef DEBUG
#define DEBUG_PRINT() int a = 5
#else
#define DEBUG_PRINT()
#endif
int main() {
DEBUG_PRINT();
return 0;
}
- קומפלו עם:
ובלעדיו. בדקו אם משתנה a קיים בכל אחת מהגרסאות.
שלב 6 – שימוש ב־#error¶
- כתבו:
-
קומפלו וראו שהקומפילציה נעצרת עם שגיאה.
-
שנו את
VERSIONל־3 וראו שהבעיה נפתרת.
שלב 7 – שימוש ב־#include עם הגדרות מוקדמות¶
- כתבו קובץ
buffer.hכך:
- כתבו קובץ
main.cכך:
בדקו בעזרת sizeof(buffer) אם ההגדרה הייתה 2048 כמו שציפיתם.
שלב 8 – תנאים לפי מערכת הפעלה¶
- כתבו בקובץ
os.h:
#ifdef _WIN32
#define OS_NAME "Windows"
#elif __linux__
#define OS_NAME "Linux"
#else
#define OS_NAME "Unknown"
#endif
- כתבו בתוכנית הראשית:
- קומפלו במערכות שונות או בעזרת הגדרת מאקרו:
אם תרצו, ניתן להריץ gcc -E כדי לראות מה עושה בדיוק ה־Preprocessor:
תוכלו לראות את התוצאה אחרי שהמאקרואים התבצעו וכל הקבצים הוכללו.