close
دانلود فیلم
ثابت ها

راهنماها

راهنماها (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

 

پيش پردازنده (preprocessor) بخشی از کامپايلر است که قسمت هائی از برنامه را، قبل از اينکه کل آن توسط کامپايلر ترجمه شود، مورد ارزيابی قرار می دهد. برنامه نويس می تواند دستوراتی را در برنامه خود درج کند که مستقيما پيش پردازنده را فراخوانی کند به اين دستورات پيش پردازنده می گويند. پيش پردازنده ها ممکن است باعث تغيير متن برنامه قبل از تحويل آن به کامپايلر شوند.

قبلا از پيش پردازنده ها در ضميمه کردن فايل يا تعريف ثابت استفاده کرده ايد.

سه کاربرد اصلی برای پيش پردازنده ها وجود دارد:

• راهنماها
• ثابت ها
• ماکروها

ثابت ها

ثابت مشابه متغير محلی برای ذخيره داده ای است که توسط برنامه استفاده می شود. اما برخلاف متغير، مقدار ذخيره شده در يک ثابت در طی اجرای برنامه قابل تغيير نيست.

++C دو نوع ثابت واقعی و سمبليک دارد.

ثابت های واقعی

ثابت واقعی (literal constant) مقداری است که مستقيما در کد برنامه تايپ می شود.


مثال. مقادير 20 و 0.28 در عبارات زير ثابت های واقعی هستند که در متغيرهای count و tax_rate ذخيره می شوند.

int count = 20;
float tax_rate = 0.28;


مقادير ثابت برای نوع های پيش ساخته می تواند به صورت های دسيمال، اکتال، هگزادسيمال، مميزشناور يا کاراکتر باشند.

نقطه اعشار نشان دهنده ثابت مميزشناور است. ثابت های مميزشناور را می توان به صورت نماد علمی هم بيان کرد.


مثال. اعداد زير همگی ثابت های مميزشناورهستند.

123.456
0.019
100.
1.23E2 or 123
4.08e6 or 4080000
0.85e-4 or 0.000085


حروف f يا F برای ثابت های float و l يا L برای ثابت های long double را می توان به عنوان پسوند اضافه کرد در غير اينصورت با ثابت مميزشناور بعنوان يک عدد double برخورد می شود.

ثابتی که نقطه اعشار ندارد بعنوان ثابت صحيح تفسير می شود. ثابت های صحيح را به 3 صورت می توان نشان داد:

• ثابت دهدهی. اگر ثابت با هر عدد غير صفری شروع شود بعنوان يک عدد صحيح مبنای 10 تفسير می شود.. ثابت های دهدهی شامل ارقام 0 تا 9 و علامت + يا – می توانند باشند. اگر علامت نوشته نشود ثابت مثبت درنظر گرفته می شود.
• ثابت اکتال. اگر ثابت با رقم 0 شروع شود بعنوان يک عدد صحيح مبنای 8 تفسير می شود. ثابت های اکتال می توانند شامل ارقام 0 تا 9 و علامت + يا – باشند.
• ثابت هگزادسيمال. اگر ثابت با 0x يا 0X شروع شود بعنوان يک ثابت مبنای 16 با آن برخورد می شود. ثابت های هگزادسيمال می توانند شامل ارقام 0 تا 9 و حروف A تا F و علامت + يا – باشند.

ثابت های کاراکتری بين علامت کوتيشن (') قرارمی گيرند، مانند کاراکترهای 'A' و '0'. کاراکترهای خاص با علامت () نشان داده می شوند مانند 'n' (newline)،'t' (tab)،'' (backslash)،'r' (carriage return)،''' (single quote)،'"' (double quotes)، و غيره.

ثابت های سمبليک

ثابت سمبليک (symbolic constant) ثابتی است که توسط يک نام در برنامه مشخص می شود. مقدار حقيقی ثابت سمبليک تنها يکبار هنگام تعريف آن وارد می شود و اين مقدار مشابه ثابت های واقعی در طول اجرای برنامه قابل تغيير نيست. هر زمان که به مقدار ثابت در برنامه نياز باشد نام آن ذکر می شود.


مثال. برای محاسبه مساحت و محيط دايره در يک برنامه به جای نوشتن عدد 3.14 می توان ثابت PI را تعريف و استفاده کرد.

circumference = PI * (2 * radius);
area = PI * (radius)*(radius);

در اين حالت هم نوشتن برنامه راحت تر است و برنامه دارای خوانائی بيشتر است هم اگر نياز به تغيير ثابت پی به مقدار 3.14159 برای بالا بردن دقت محاسبات باشد اصلاح تنها در يک نقطه برنامه که ثابت تعريف شده است صورت می گيرد نه کل برنامه.


تعريف ثابت سمبليک

دوروش برای تعريف ثابت های سمبليک وجود دارد: راهنمای define# و کلمه کليدی const.

راهنمای define# در قسمت پيش پردازنده ها بيشتر توضيح داده خواهد شد. فرم کلی آن به صورت زير است:

#define CONSTNAME literal

CONSTNAME نام ثابت و literal مقدار واقعی آن است. راهنمای define# به کامپايلر دستور می دهد که درسرتاسر کد برنامه CONSTNAME را با literal جايگزين کند.

نام ثابت از همان قواعد نامگذاری متغيرها تبعيت می کند. مرسوم است که کليه حروف ثابت را بزرگ می نويسند که باعث تشخيص راحت تر آن از متغيرها که با حروف کوچک هستند می شود.


مثال. ثابت PI با مقدار 3.14159 تعريف شده است.

#define PI 3.14159


دقت کنيد که خط define# به سميکولن(;) ختم نمی شود. define# می تواند در هر کجای برنامه باشد ولی معمولا همگی در قسمتی از ابتدای کد برنامه و قبل از تابع main() هستند.

روش دوم تعريف يک ثابت سمبليک استفاده از کلمه کليدی const است. const را می توان به اول هر اعلان متغيری اضافه کرد. در اين صورت متغير در طول اجرای برنامه قابل تغيير نخواهد بود. اگر برنامه سعی به تغيير آن کند خطای کامپايلر صادر خواهد شد.


مثال.

const int count = 100;
const float pi = 3.14159;
const long debt = 12000000, float tax_rate = 0.21;


const روی کليه متغيرهای خط اعلان تاثير می گذارد.

تفاوت ثابت هائی که با #define و const تعريف می شوند در حوزه آنهاست. وقتی از #define استفاده می کنيد کنترل ثابت ها را از حوزه کامپايلر خارج می کنيد؛ type checking روی اسم آن انجام نمی گيرد و آدرس آنرا قابل بازيابی نيست و اشاره گريا ارجاعی به آن ممکن نيست و نمی تواند از نوع user-defined باشد. اما اگر ثابت توسط const تعريف شده باشد می تواند از هر نوع داده استاندارد يا user-defined باشد. آدرس آن هم قابل بازيابی است و مانند يک متغير دارای حوزه دسترسی است بنابراين ثابتی که درون يک تابع تعريف می شود در ساير نقاط برنامه شناخته شده نيست.

به کانال تلگرام سایت ما بپیوندید