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:
תוכלו לראות את התוצאה אחרי שהמאקרואים התבצעו וכל הקבצים הוכללו.