پیش پردازنده در زبان C – آموزش زبان C

c preprocessors 4159 پیش پردازنده در زبان C   آموزش زبان C

پیش پردازنده در زبان C

پیش پردازنده جزء کامپایلر زبان C نیست بلکه یک مرحله جداگانه در فرآیند کامپایل برنامه است. به عبارت دیگر پیش پردازنده فقط یک ابزار جایگزینی متن است و این عمل را قبل از کامپایل شدن برنامه انجام می دهد. CPP نامی است که به اختصار به آن می گویند و مخفف C Preprocessor می باشد. تمام دستورات پیش پردازنده در زبان برنامه نویسی C با نماد # آغاز می شوند. در جدول زیر دستورات پیش پردازنده مهم در زبان C را مشاهده می کنید:

ردیف توضیحات
۱ #define

یک ماکرو پیش پردازنده را جایگزین می کند.

۲ #include

یک فایل هدر را به برنامه اضافه می کند.

۳ #undef

ماکرو تعریف شده توسط دستور #define را حذف می کند.

۴ #ifdef

اگر این ماکرو تعریف شده باشد، true باز می گرداند.

۵ #ifndef

اگر این ماکرو تعریف نشده باشد، true باز می گرداند.

۶ #if

دستور شرطی زمان کامپایل است.

۷ #else

جایگزینی برای #if در صورتی که شرط بررسی شده درست نباشد.

۸ #elif

#if و #else در یک دستور.

۹ #endif

بخش شرطی پیش پردازنده را خاتمه می دهد.

۱۰ #error

پیام خطا را در stderr تنظیم می کند.

۱۱ #pragma

با استفاده از یک روش استاندارد، دستورالعمل های خاصی را برای کامپایلر انجام می دهد.

مثال های پیش پردازنده

برای درک بهتر موضوع پیش پردازنده، مثال های زیر را بررسی کنید.

#define MAX_ARRAY_LENGTH 20

دستور فوق برای جایگزینی MAX_ARRAY_LENGTH با مقدار ۲۰ استفاده می شود. یعنی هر کجایی برنامه از MAX_ARRAY_LENGTH استفاده کنید، هنگام کامپایل با ۲۰ جایگزین می شود.

#include <stdio.h>
#include "myheader.h"

دستور فوق یعنی #include فایل های header مختلف را به برنامه اضافه می کند. خط اول برای اضافه کردن فایل های سیستمی است و خط دوم هم فایل هایی که توسط برنامه نویس نوشته شده است را اضافه می کند.

#undef  FILE_SIZE
#define FILE_SIZE 42

دستور فوق FILE_SIZE تعریف شده را حذف می کند و سپس آن را با مقدار جدید یعنی ۴۲ تنظیم می کند.

#ifndef MESSAGE
#define MESSAGE "You wish!"
#endif

دستور فوق بررسی می کند که آیا MESSAGE تعریف شده است یا خیر. در صورتی که تعریف نشده باشد، آن را تعریف می کند.

#ifdef DEBUG
/* Your debugging statements here */
#endif

اگر DEBUG تعریف شده باشد، دستورات موجود در بلوک #ifdef و #endif اجرا می شوند.

ماکروهای از پیش تعریف شده

جدول زیر ماکروهای از پیش تعریف شده در زبان برنامه نویسی C را نشان می دهد:

ردیف توضیحات
۱ __DATE__

تاریخ جاری در فرمت “MMM DD YYYY” را در خود ذخیره می کند.

۲ __TIME__

زمان جاری در فرمت “HH: MM: SS” را در خود ذخیره می کند.

۳ __FILE__

نام فایل جاری را به صورت رشته در خود ذخیره می کند.

۴ __LINE__

شماره خط جاری را به صورت یک عدد دسیمال در خود ذخیره می کند.

۵ __STDC__

اگر عمل کامپایل بر اساس استاندارد ANSI صورت گیرد، مقدر یک را در خود ذخیره می کند.

برای مشاهده عملکر ماکروهای فوق مثال زیر را امتحان کنید:

#include <stdio.h>
int main() {
   printf("File :%s\n", __FILE__ );
   printf("Date :%s\n", __DATE__ );
   printf("Time :%s\n", __TIME__ );
   printf("Line :%d\n", __LINE__ );
   printf("ANSI :%d\n", __STDC__ );
}

امتحان کنید

زمانی که کد بالا کامپایل و اجرا شود، نتیجه زیر را تولید خواهد کرد:

File :test.c
Date :Jun 2 2012
Time :03:36:24
Line :8
ANSI :1

عملگرهای پیش پردازنده

زبان C برای ایجاد ماکروهایی با قابلیت بیشتر، عملگرهای زیر را ارائه می کند.

عملگر ادامه ماکرو (\)

یک ماکرو معمولا در یک خط نوشته می شود، اما ممکن است گاهی اوقات  ماکرو ما طولانی شود. در این مواقع می توان از عملگر (\) استفاده کرد. مانند نمونه زیر:

#define  message_for(a, b)  \
printf(#a " and " #b ": We love you!\n")

عملگر رشته سازی (#)

از این عملگر برای تبدیل پارامتر یک ماکرو به یک رشته استفاده می شود. مثال زیر به خوبی نحوه عملکر این عملگر را نشان می دهد:

#include <stdio.h>
#define  message_for(a, b)  \
printf(#a " and " #b ": We love you!\n")
int main(void) {
   message_for(Carole, Debra);
   return 0;
}

امتحان کنید

زمانی که کد بالا کامپایل و اجرا شود، نتیجه زیر را تولید خواهد کرد:

Carole and Debra: We love you!

عملگر چسباندن token (##)

این عملگر دو token جدا را به یک token واحد تبدیل می کند. به مثال زیر توجه کنید:

#include <stdio.h>
#define tokenpaster(n) printf ("token" #n " = %d", token##n)
int main(void) {
   int token34 = 40;
   tokenpaster(34);
   return 0;
}

امتحان کنید

زمانی که کد بالا کامپایل و اجرا شود، نتیجه زیر را تولید خواهد کرد:

token34 = 40

خروجی واقعی پیش پردازنده به صورت زیر است:

printf ("token34 = %d", token34);

عملگر Defined()

عملگر defined در یک عبارت ثابت بررسی می کند که یک شناسه با استفاده از دستور #define تعریف شده است یا نه. اگر تعریف شده باشد، مقدار غیر صفر (true) باز میگرداند و اگر تعریف نشده باشد، مقدار صفر (false) باز میگرداند. مثال زیر نحوه استفاده از این عملگر را نشان می دهد:

#include <stdio.h>
#if !defined (MESSAGE)
   #define MESSAGE "You wish!"
#endif
int main(void) {
   printf("Here is the message: %s\n", MESSAGE);  
   return 0;
}

امتحان کنید

زمانی که کد بالا کامپایل و اجرا شود، نتیجه زیر را تولید خواهد کرد:

Here is the message: You wish!

ماکروهای پارامتریک

یکی از ویژگی های قدرتمند پیش پردازنده، امکان شبیه سازی توابع با استفاده از ماکروهای پارامتریک می باشد. برای نمونه مثال زیر را در نظر بگیرید:

int square(int x) {
   return x * x;
}

کد بالا را می توان به این صورت هم نوشت:

#define square(x) ((x) * (x))

ماکروهای پارامتریک باید قبل از استفاده شدن، توسط دستور #define تعریف شوند. لیست پارامترها بین پرانتز باز و بسته قرار می گیرد و نباید بین نام ماکرو و پرانتزها فاصله باشد. مثلا:

#include <stdio.h>
#define MAX(x,y) ((x) > (y) ? (x) : (y))

int main(void) {
   printf("Max between 20 and 10 is %d\n", MAX(10, 20));  
   return 0;
}

امتحان کنید

زمانی که کد بالا کامپایل و اجرا شود، نتیجه زیر را تولید خواهد کرد:

Max between 20 and 10 is 20

نوشته پیش پردازنده در زبان C – آموزش زبان C اولین بار در سورس سرا - آموزش برنامه نویسی. پدیدار شد.

درباره نویسنده: administrator

ممکن است دوست داشته باشید

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *