پیش پردازنده ها و ماکروها در برنامه نویسی C
در این آموزش با پیش پردازنده ها (preprocessors) در زبان c آشنا خواهید شد و نحوه استفاده از #include، #define و کامپایل مشروط را به کمک مثال یاد خواهید گرفت.
پیش پردازنده C یک پیش پردازنده ماکرو است که برنامه را قبل از کامپایل تغییر می دهد. این تغییرات می تواند شامل فایل سرآیند، توسعه ماکرو و … باشد.
همه دستورالعمل های پیش پردازش با نماد # شروع می شوند. مثال،
#define PI 3.14
کاربردهای رایج پیش پردازنده ها در C
اضافه کردن فایل های سرآیند: #include
پیش پردازنده include# برای قرار دادن فایل های سرآیند یا هدر در برنامه استفاده می شود. مثال،
#include <stdio.h>
stdio.h یک فایل هدر است. پیش پردازنده #include محتویات فایل هدر stdio.h را جایگزین خط بالا می کند.
به همین دلیل قبل از استفاده از توابعی مانند ()scanf و ()printf باید از
#include <stdio.h>
استفاده کنید.
علاوه بر این با استفاده از این دستور پیش پردازنده می توانید فایل هدر حاوی تعریف تابعی که خودتان ایجاد کرده اید را در برنامه اضافه کنید.
#include “my_header.h”
ماکروها با استفاده از #define
ماکرو قطعه کدی است که به آن یک اسم داده می شود. با استفاده از دستورالعمل پیش پردازنده define# می توانید یک ماکرو در زبان C تعریف کنید. مثال،
#define c 299792458 // سرعت نور
در اینجا وقتی از c در برنامه استفاده شود، مقدار ۲۹۹۷۹۲۴۵۸ جایگزین آن می شود.
مثال ۱: پیش پردازنده #define
#include <stdio.h>
#define PI 3.1415
int main()
{
float radius, area;
printf(“Enter the radius: “);
scanf(“%f”, &radius);
// می شود PI مقدار ۳٫۱۴۱۵ جایگزین
area = PI*radius*radius;
printf(“Area=%.2f”,area);
return 0;
}
ماکروهای شبیه به تابع
می توانید ماکروهایی را تعریف کنید که مانند فراخوانی تابع کار می کنند، به این ماکروها، ماکروهای تابعی گفته می شود. مثال،
#define circleArea(r) (3.1415*(r)*(r))
هر بار که برنامه با (circleArea(argument مواجه می شود، آن را با
(۳٫۱۴۱۵*(argument)*(argument))
جایگزین می کند.
فرض کنید عدد ۵ به عنوان آرگومان به تابع ارسال می شود،
circleArea(5) (3.1415*5*5)
مثال ۲: استفاده از پیش پردازنده define#
#include <stdio.h>
#define PI 3.1415
#define circleArea(r) (PI*r*r)
int main() {
float radius, area;
printf(“Enter the radius: “);
scanf(“%f”, &radius);
area = circleArea(radius);
printf(“Area = %.2f”, area);
return 0;
}
کامپایل مشروط
در برنامه نویسی C می توانید به پیش پردازنده دستور دهید که آیا یک بلاک کد در برنامه درج شود یا خیر. برای این کار از دستورالعمل های شرطی استفاده کرد.
شبیه به دستور if با یک تفاوت بزرگ است، دستور if در زمان اجرای برنامه ارزیابی می کند که آیا یک قطعه کد اجرا شود یا خیر، در حالی که شرط های پیش پردازنده برای قرار دادن یا پرش از یک بلوک کد، قبل از اجرای برنامه استفاده می شوند.
موارد استفاده کامپایل مشروط
- براساس دستگاه یا سیستم عامل از کد های مختلف استفاده می شود.
- فایل منبع یکسان در دو برنامه مختلف کامپایل می شود.
- حذف کد خاصی از برنامه اما به عنوان یک مرجع برای اهداف بعدی نگه داشته می شود.
پیش پردازنده های شرطی
برای کامپایل مشروط از دستورالعمل های پیش پردازنده شرطی ifdef، #if،#defined ، #else# و elseif# استفاده می شود.
ifdef#
#ifdef MACRO
// کدهای شرطی
#endif
در اینجا کدهای شرطی فقط در صورتی که MACRO (یک ماکرو است) تعریف شده باشد، در برنامه گنجانده و کامپایل می شوند.
#if،#elif و #else
#if expression
// کدهای شرطی
#endif
expression می تواند عدد صحیح، کاراکتر، عبارت حسابی ماکرو و … باشد.
کدهای شرطی زمانی در برنامه قرار داده می شوند که مقدار expression، مقداری غیر صفر باشد.
می توانید دستور اختیاری #else را همراه با دستور #if استفاده کنید.
#if expression
// صفر نباشدexpression کدهای شرطی اگر
#else
// صفر باشدexpression کدهای شرطی اگر
#endif
علاوه بر این می توانید با استفاده از elif#، شرط های تودرتو به if…#else# اضافه کنید.
#if expression
// صفر نباشد expression کدهای شرطی اگر
#elif expression1
// صفر نباشد expression1 کدهای شرطی۱ اگر
#elif expression2
// صفر نباشد expression2 کدهای شرطی۲ اگر
#else
// صفر باشند هاexpression اگر همه
#endif
defined#
از عملگر خاص defined# برای بررسی اینکه آیا یک ماکرو خاص تعریف شده یا نشده استفاده می شود، اغلب همراه با دستور #if می آید.
#if defined BUFFER_SIZE && BUFFER_SIZE >= 2048
// کدها
ماکروهای از پیش تعریف شده
در جدول زیر چند ماکرو از پیش تعریف شده در برنامه نویسی C معرفی شده است:
مقدار | ماکرو |
یک رشته حاوی تاریخ فعلی است. | __DATE__ |
یک رشته حاوی نام فایل است. | __FILE__ |
یک عدد صحیح که شماره خط فعلی را نشان می دهد. | __LINE__ |
اگر از استاندارد ANSI در C پیروی کند آنگاه مقدار آن یک عدد صحیح غیر صفر است | __STDC__ |
یک رشته حاوی زمان فعلی است. | __TIME__ |
مثال ۳: دریافت زمان فعلی با استفاده از __TIME__
برنامه زیر با استفاده از ماکرو __TIME__ زمان فعلی سیستم را دریافت می کند.
#include <stdio.h>
int main()
{
printf(“Current time: %s”,__TIME__);
}
خروجی
Current time: 19:54:39