دستورات پیش پردازنده در زبان c
همانطور که می دانید پیش پردازندهها برنامههایی هستند که برای ایجاد داده های خروجی (جدید) بر روی داده های ورودی (اولیه) پردازش انجام می دهند و اطلاعات را برای کامپیوتر قابل فهم تر می سازند. از آنجایی که این Preprocessor ها متنوع هستند انتخاب آن ها کمی دشوار می باشد. اگر برنامه نویس زبان C هستید و می خواهید کد های خود را برای کامپیوتر قابل فهم تر نمایید، آشنایی با دستورات پیش پردازنده در زبان c به شما بسیار کمک می کند و برای این عمر می توانید از این مقاله بهرهمند شوید.
آنچه در این مقاله می آموزید:
Toggleپیش پردازنده یا preprocessor چیست؟
پیش پردازنده در زبان انگلیسی با نام Preprocessor شناخته شده است. در دنیای کامپیوتر، پیش پردازندهها به برنامه هایی گفته می شوند که با پردازش بر روی داده های ورودی، داده های خروجی را می سازند. این داده های خروجی در برنامه های دیگر به عنوان داده های ورودی استفاده می شوند. Preprocessor ها علاوه بر رفع مشکلات کد نویسی، روش هایی را برای راحتی و افزایش سرعت کد نویسی نیز ارائه می کنند. عملکرد پیش پردازندهها به نوع طبیعت آن ها بستگی دارد. مثلا یک Preprocessor با ساختار ساده، تنها در جابجایی متن ها یا بسط ماکرویی روی داده ورودی استفاده می شود.
انواع پیش پردازنده
Preprocessor انواع مختلفی دارد که در این قسمت به معرفی آن ها می پردازیم و در قسمت های بعدی مقاله به طور کامل به آن ها پرداخته می شود.
- پیش پردازنده HTML
- Preprocessor css
- پیش پردازنده زبان C
- Preprocessor زبان C++
دستورات پیش پردازنده در زبان سی (C)
همانطور که در مقاله پیش پردازنده گفته شد، پیش پردازنده ها مترجم هایی می باشند که دستورات توسعه یافته را دریافت و به دستورات قابل فهم برای کامپایلر (زبان) تغییر می دهند. به طور کلی می توانیم پیش پردازنده را به عنوان برنامه جدید که توسط پردازنده (CPU) قابل ترجمه و اجرا می باشد معرفی کنیم. دستورات Preprocessor در زبان برنامه نویسی C به صورت زیر می باشد.
مفهوم ماکرو
یکی از موضوعات موجود در دستورات پیش پردازنده در زبان c، ماکرو ها می باشند. ماکرو یک تکه کد می باشد که به داده ها اختصاص داده می شود. در صورتی که نام ماکرو در برنامه استفاده شود، به جای آن محتوای ماکرو قرار داده می شود. انواع ماکرو به صورت زیر می باشد.
- ماکرو های بدون پارامتر
- ماکرو های شبه تابع (همراه با پارامتر)
فراموش نکنید که هر 2 ماکرو از دستور پیش پردازند define# استفاده می کنند. به دستور زیر توجه نمایید.
<رشته ای از کاراکتر ها> <نام ماکرو> define # |
دستورات پیش پردازنده مهم در زبان C
مهمترین دستورات پیش پردازنده در زبان c که بسیار رایج می باشند، در این جدول برای شما آمده است.
نام دستور | توضیحات |
define# | یک ماکرو پیش پردازنده را جایگزین می کند |
include# | یک فایل هدر را به برنامه اضافه می کند |
undef# | ماکرو تعریف شده توسط دستور define# را حذف می کند |
ifdef# | اگر این ماکرو تعریف شده باشد، true باز می گرداند |
ifndef# | اگر این ماکرو تعریف نشده باشد، true باز می گرداند |
if# | دستور شرطی زمان کامپایل است |
else# | جایگزینی برای if# در صورت درست نبودن شرط بررسی شده |
elif# | if# و else# در یک دستور |
endif# | بخش شرطی پیش پردازنده را خاتمه می دهد |
error# | پیام خطا را در stderr تنظیم می کند |
pragma# | دستورالعمل های خاصی را برای کامپایلر انجام می دهد |
مثال دستورات پیش پردازنده در زبان c
دستور زیر نمایش دهنده جایگزینی MAX_ARRAY_LENGTH با مقدار ۲۰ می باشد. با کد زیر، هر قسمت از برنامه که دارای MAX_ARRAY_LENGTH باشد را در زمان اجراء به مقدار ۲۰ بر می گرداند.
define MAX_ARRAY_LENGTH 20 # |
در کد زیر می خواهیم درباره دستور include # صحبت کنیم. وظیفه دستور #include، اضافه کردن فایل های header مختلف به برنامه می باشد. کد خط اوا مربوط به اضافه کردن فایل های سیستمی است و کد خط دوم نیز برای اضافه کردن فایل هایی که توسط برنامه نویس نوشته می شود استفاده می گردد.
<include <stdio.h# “include “myheader.h# |
برای حذف FILE_SIZE تعریف شده در برنامه و تغییر آن به مقدار مقدار جدید، می توانید از دستور زیر که یکی از دستورات پیش پردازنده در زبان c می باشد استفاده نمایید. در کد زیر مقدار مورد نظر 42 می باشد که می توانید آن را به مقدار دلخواه خود تغییر دهید.
undef FILE_SIZE # define FILE_SIZE 42 # |
دستور زیر نمایش دهنده موضوع تعریف MESSAGE می باشد که در صورت تعریف نشدن MESSAGE آن را تعریف می کند.
ifndef MESSAGE # “!define MESSAGE “You wish # endif # |
در دستور زیر، اگر DEBUG تعریف شود، دستورات موجود در بلوک #ifdef و #endif قرار و اجرا می شوند.
ifdef DEBUG # /* Your debugging statements here */ endif # |
ماکروهای از پیش تعریف شده
ماکروهای موجود در دستورات پیش پردازنده در زبان c به صورت زیر می باشند.
نام ماکرو | توضیحات |
__DATE__ | تاریخ جاری در فرمت “MMM DD YYYY” را در خود ذخیره می کند |
__TIME__ | زمان جاری در فرمت “HH: MM: SS” را در خود ذخیره می کند |
__FILE__ | نام فایل جاری را به صورت رشته در خود ذخیره می کند |
__LINE__ | شماره خط جاری را به صورت یک عدد دسیمال در خود ذخیره می کند |
__STDC__ | گر عمل کامپایل بر اساس استاندارد ANSI صورت گیرد، مقدر یک را در خود ذخیره می کند |
عملگرهای پیش پردازندهها
به غیر از ماکروها، عملگرها نیز در دستورات پیش پردازنده در زبان c وجود دارند که بیشتر برنامه نویسان در برنامه نویسی خود از آن ها استفاده می کنند.
عملگر ادامه ماکرو (\)
در صورتی که ماکرو نوشته شده طولانی باشد می توانید از عملگر ادامه ماکرو که با علامت (\) نمایش داده می شود، برای کوتاه کردن ماکرو استفاده نمایید. به مثال زیر توجه نمایید.
\ (define message_for(a, b) # (“printf(#a ” and ” #b “: We love you!\n |
عملگر رشته سازی (#)
یکی از عملگر های موجود در دستورات پیش پردازنده در زبان c، عملگر رشته ساز می باشد. شما به وسیله آن می توانید یک پارامتر یا یک ماکرو را به یک رشته تبدیل نمایید.
<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 { |
عملگر چسباندن token (##)
می توانیم یکی دیگر از عملگر های دستورات پیش پردازنده در زبان c، را با عنوان عملگر چسباندن به شما معرفی نماییم. شما با کمک این عملگر می توانید، دو 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 |
عملگر Define()
یکی از مهم ترین عملگر های موجود در دستورات پیش پردازنده در زبان c، عملگر یا دستور define# می باشد. این عملگر مشخص می کند که یک شناسه با دستور 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 مشخص می باشد، با شرط اجرا می شوند که در این قسمت به معرفی آن ها می پردازیم.
if# و endif#
عبارت شرطی if# مجموعه دستورات endif# |
elif# همانند else#
1 عبارت شرطی if# 1 مجموعه دستورات 2 عبارت شرطی elif# 2مجموعه دستورات . . . n عبارت شرطی elif# n مجموعه دستورات endif# |
ifdef#
نام ماکرو ifdef# /* مجموعه ی دستورات */ . . . endif# |
ifndef#
نام ماکرو ifndef# /* مجموعه ی دستورات */ endif# |
ماکرو های شبیه به تابع (function-like)
در دستورات پیش پردازنده در زبان c ماکروهایی وجود دارد که به آن ها ماکروهای شبیه به تابع گفته می شود. این ماکروها همانند توابع عمل می کنند و در مقاصد مشابه مورد استفاده قرار می گیرند تا نوشته و از آن ها استفاده شود.
function macro example // <include <iostream # ;using namespace std ((define getmaximum(a,b) ((a)>(b)?(a):(b# ()int main } ;int x=5, y ;(y= getmaximum(x,2) ;cout << y << endl ;cout << getmaximum(7,x) << endl ;return 0 { |
ماکروهای شبیه اشیاء (Object-like macros)
یکی دیگر از مدل ماکرو ها در دستورات پیش پردازنده در زبان c، ماکروهای شبیه اشیاء می باشند و زمانی که پیش پردازنده با این دستور مواجه می شود متن (substitution_text) را جایگزین آن می کند.
define MY_FAVORITE_NUMBER 9 # ;std::cout << “My favorite number is: ” << MY_FAVORITE_NUMBER << std::endl |
پیش پردازنده کد بالا را به صورت زیر تغییر می دهد.
;std::cout << “My favorite number is: ” << 9 << std::endl |
خروجی کد بالا به صورت زیر می باشد.
My favorite number is: 9 |
دستورات مهم در زبان C
در این قسمت به دیگر دستورات پیش پردازنده در زبان c می پردازیم.
دستور float در زبان c
به دلیل اینکه استفاده از نوع داده یا دستور float نیاز به حافظه بسیاری دارد و باعث کند شدن اجرا دستورات می شود، به تنهایی در برنامه مورد استفاده قرار نمی گیرد و استفاده نمی شود. این دستور از نوع داده int کندتر می باشد و برای مقایسه 2 عدد سخت تر است. برای استفاده از این نوع داده برای مقایسه 2 عدد، باید از متغیری استفاده نمایید.
دستور delay در زبان c
تابع delay یکی از توابع موجود در دستورات پیش پردازنده در زبان c می باشد که در ایجاد وقفه در برنامه مورد استفاده قرار می گیرد. در صورتی که در پرانتز عدد 1000 را وارد نمایید، وقفه ای 1 ثانیه ای ایجاد می کنید. برای استفاده از این تابع باید آن را به کتابخانه مورد نظر معرفی نمایید و این تابع در كتابخانه dos.h قرار می گیرد.
دستور define
دستور define یک ثبات مقادیر می باشد که در طول اجرای برنامه ثابت می مانند و امکان تغییر آن ها وجود ندارد. برای تعریف ثابت ها در دستورات پیش پردازنده در زبان c باید از کلمات کلیدی Const و یا دستور define# استفاده نمایید.
برای تعریف ثوابت دستور define# از دستور زیر استفاده نمایید.
مقدار نام ثابت define # |
به مثال زیر توجه نمایید.
define sum 200 # define p 3.14 # |
سخن پایانییکی از موضوعات جالب، پیش پردازنده ها می باشند که در بین برنامه نویسان و طراحان دارای اهمیت می باشد. پیش پردازنده ها مدل های مختلفی همچون یش پردازنده HTML Preprocessor ،css، پیش پردازنده زبان C و Preprocessor زبان C++ می باشد. فراموش نکنید که دستورات پیش پردازنده در زبان c تقریبا شبیه به دستورات پیش پردازنده در زبان ++c می باشند و در بین برنامه نویسان C بسیار محبوبمی باشند. تیم بی لرن قصد دارد که در این مقاله به دستورات پیش پردازنده در زبان c بپردازد تا کمک بسیار زیادی به برنامه نویسان زبان C کند. برای دریافت پاسخ سوالات خود و بهره مند شدن از تجربه اساتید خبره و دیگر دوستانتان در کمپین آموزشی بی لرن می توانید سوالات خود را در کافه گپ و گفت مطرح نمایید و در سریعترین زمان، پاسخ سوال خود را دریافت نمایید. همچنین می توانید با عضویت در کمپین آموزشی بی لرن، از دوره های آموزشی رایگان و کاربردی در زمینه های مختلف به صورت تخصصی و حرفه ای بهره مند شوید. با توجه به مسیر یادگیری در زمینه های مختلف می توانید برای شروع طراحی سایت و برنامه نویسی از آموزش html و css بهره مند شوید. |
دیدگاهتان را بنویسید