راهنماها
راهنماها (directives) دستوراتی هستند که توسط برنامه نويس به پيش پردازنده داده می شوند تا عمل خاصی را انجام دهد. برای مثال ثابتی را در متن جايگزين کند، محتوای فايل ديگری را در فايل مبدا درج کند يا بخشی از کد را ترجمه نکند.
راهنماها باعث می شوند متن برنامه به سادگی تغيير کند و درمحيط های مختلف قابل کامپايل باشد.
خطوط پيش پردازنده قبل از بسط ماکروها تشخيص و اجرا می شود. بنابراين اگر ماکرو به چيزی مشابه يک فرمان پيش پردازنده بسط داده شود دستور توسط پيش پردازنده تشخيص داده نمی شود.
پيش پردازنده راهنماهای زير را تشخيص می دهد:
#define | #error | #include | #if |
#else | #elif | #endif | #ifdef |
#ifndef | #import | #line | #pragma |
#undef | #using |
نکته. راهنماها هميشه با علامت # (sharp sign) شروع می شوند.
نکته. بين علامت # و اولين کاراکتر راهنما می تواند فاصله باشد.
نکته. بعضی راهنماها شامل آرگومان ها و مقادير هستند. هر متن ديگری بجز آرگومان و مقدار که به دنبال راهنما می آيد ابتدايش بايد علامت توضيح باشد (//) يا در بين علائم (/* */) قرار بگيرد.
نکته. خط شامل راهنما می تواند با علامت انتهای خط () ختم شود.
نکته. راهنماها می توانند در هرجائی از فايل منبع قرار بگيرند اما تنها روی بقيه کد تاثير می گذارند.
ثابت ها
همانطور که در بخش ثابت ها توضيح داده شده است از راهنمای #define می توان برای تعريف يک ثابت سمبليک استفاده کرد. شکل کلی تعريف ثابت به صورت زير است:
#define [identifier name] [value]
پيش پردازنده قبل از کامپايل در متن برنامه شناسه Identifier name را با مقدار value جايگزين خواهد کرد.
اگر ثابت را به صورت يک عبارت محاسباتی تعريف کنيد بهتر است مقدار را درون پرانتز قرار دهيد. به اين ترتيب الويت عمليات حفظ خواهد شد.
مثال. تعريف ثابت زير در نظر بگيريد:
#define PI_PLUS_ONE (3.14 + 1)
که به صورت زير استفاده می شود:
x = PI_PLUS_ONE * 5;
اگر پرانتزها را قرار ندهيم عبارت به صورت زير محاسبه خواهد شد، يعنی ابتدا عمل 1*5 انجام می شود سپس عمل جمع.
x = 3.14 + 1 * 5;
ضميمه کردن فايل
راهنمای include# به پيش پردازنده می گويد که متن يک فايل را بگيرد و در برنامه جاری درج کند. معمولا راهنمای include# در ابتدای برنامه قرار می گيرد. به همين دليل نام header file به فايل هائی که ضميمه می شوند گفته می شود.
نام فايل هدر در مقابل راهنمای include# قرار می گيرد. درج نام فايل بين علائم < > يا " " نحوه جستجوی فايل را مشخص می کند. اگر نام فايل بين علائم < > محصور باشد کامپايلر فايل را در مسيرهای تعيين شده در بخش تنظيمات کامپايلر جستجو می کند ولی اگر نام فايل مابين علائم " " قرار گيرد کامپايلر آنرا ابتدا در مسير جاری برنامه جستجو می کند.
فايل های هدر استاندارد نظير iostream.h بين علائم < > محصور می شوند.
کامپايل شرطی
مجموعه ای از راهنماها وجود دارند که تعيين می کنند آيا خطوط برنامه قبل از تحويل به کاميايلر حذف شوند يا خير. اين راهنماها شامل #if، #elif، #else، #ifdef و ifndef# هستند.
يک بلوک شرطی که با يکی از راهنماهای شرطی شروع می شود حتما بايد به endif# ختم شود. بهتر است مقابل عبارت endif# توضيحی باشد که مشخص شود کدام بلوک شرطی بسته شده است.
يکی از کاربردهای راهنماهای شرطی وقتی است که فايل هدری در چند فايل هدر ديگر که بايد در برنامه اصلی ضميمه شوند مورد نياز است. مشکلی که پيش می آيد اين است که متغيرها، ثابت ها، کلاس ها و توابع فايل هدر چندبار در برنامه ظاهر خواهند شد که سرباری برای کامپايلر می شود. با پيش پردازنده ها به راحتی می توان تضمين کرد که هر فايل هدر تنها يکبار در برنامه اصلی اضافه می شود. راهنمای (if not defined) #ifndef بلوکی از متن را تنها اگر عبارت خاصی قبلا تعريف نشده باشد اجرا می کند.
کدی که در idndef# ضميمه می شود تنها يکبار زمانی که فايل لود می شود بار می شود.
#ifndef _FILE_NAME_H_
#define _FILE_NAME_H_
/* code */
#endif // #ifndef _FILE_NAME_H_
شناسه ای که مقابل ifndef# ذکر می شود لازم نيست حتما مقداری داشته باشد زيرا با اضافه شدن خط define# تعريف می شود.
مثال. تعريف ثابت خاص NULL توسط راهنماهای شرطی.
#ifndef NULL
#define NULL (void *)0
#endif // #ifndef NULL
مثال. راهنماهای شرطی برای بلوکی که شامل توضيحات چندخطی است و می خواهيد همگی توضيحی شوند روش خوبی است.
#if 0
/* comment ...
*/
// code
/* comment */
#endif