دستورات پیش پردازنده در زبان سی پلاس پلاس ++C

دستورات پیش پردازنده در زبان سی پلاس پلاس C++
پیش پردازنده، نوعی مترجم است که دستورات توسعه یافته ای از یک زبان برنامه نویسی را گرفته، به دستورات قابل فهم برای کامپایلر همان زبان تبدیل میکند. به عبارت دیگر، ورودی پیش پردازنده برنامه ای با دستورات توسعه یافته است و خروجی آن،برنامه دیگری است که توسط پردازنده (CPU) قابل ترجمه و اجراست. دستورات توسعه یافته ای در زبان C وجود دارند که توسط پردازنده قابل ترجمه و اجرا نیست، بلکه فقط توسط پیش پردازنده قابل فهم هستندو به دستورات پیش پردازنده معروفند. دستورات پیش پردازنده در زبان C از اهمیت ویژه ای برخوردارند.
تعریف ماکرو
ماکرو، نامی برای یک رشته است که این رشته میتواند ترکیبی از حروف، ارقام، مقادیر ثابت، توابع و غیره باشد. دستور پیش پردازنده #define برای تعریف ماکرو استفاده میشود. این دستور قبل از تابع main() به دو صورت به کار میرود که یک روش آن بصورت زیر است:
<رشته> <نام ماکرو> #define
نام ماکرو، همانند نام یک متغیر در C است که حداقل باید با رشته تعریف کننده ماکرو، یک فاصله داشته باشد و بهتر است جهت مشخص بودن در برنامه با حروف بزرگ انتخاب شود. در مورد دستورات پیش پردازنده در زبان C باید این نکته را در نظر داشت که آنها علیرغم سایر دستورات زبان C به ; ختم نمیشوند.
کاربرد دیگر دستور #define در تعریف ماکروهایی است که دارای پارامتر باشند. در این مورد از این دستور بصورت زیر استفاده میشود:
تعریف ماکرو (اسامی پارامترها) نام ماکرو #define
تعریف ماکرو، مشخص میکند که چه عملی باید توسط ماکرو انجام گیرد. اسامی پارامترها متغیرهایی هستند که در حین اجرای ماکرو به آن منتقل میشوند. اگر تعداد آنها بیش از یکی باشد با کاما از هم جدا می شوند.
برخلاف توابع، در ماکروها نیازی به تعریف نوع پارامترها نیست. بعنوان مثال دستور #define READINT(I) ماکرویی به نام READINT تعریف میکند که دارای پارامتر "I" است. اگر بخواهیم متغیری مثل distance را از ورودی بخوانیم کافیست ماکروی فوق را بصورت READINT (distance); فراخوانی کنیم.
اگر تعریف ماکرو شامل عبارتی طولانی باشد (طوری که در یک خط قابل بیان نباشد) میتوان آن را در دو یا چند خط ادامه داد. بدین منظور باید در انتهای هر خط ناتمام از کاراکتر back slash() استفاده نمود.
دستورات پیش پردازنده شرطی
در حالت معمولی، دستور if برای تصمیم گیری در نقاط مختلف به کار میرود. شرط هایی که در دستور if ذکر میشوند و در حین اجرای برنامه ارزشیابی میشوند. یعنی اگر شرط ذکر شده در دستور if چه درست باشد چه نادرست، این دستور و کلیه دستورات دیگر که در بلاک if قرار دارند ترجمه میشوند ولی در دستورات پیش پردازنده ی شرطی، شرطی که در آن ذکر میشود در حین ترجمه ارزشیابی میشود.
دستورات پیش پردازنده شرطی عبارتنداز:
► #if
► #else
► #elif
► #endif
► #ifdef
► #ifndef
دستور #if بصورت زیر بکار میرود:
#if عبارت شرطی
مجموعه دستورات
#endif
عبارت شرطی که در دستور #if ذکر میشود، عبارتی است که مقدار آن در زمان ترجمه معلوم است. این عبارت در حین ترجمه ارزیابی میشود. چنانچه دارای ازش درستی باسد مجموعه دستورات موجود در بین #if و #endif ترجمه خواهد شد وگرنه این مجموعه دستورات ترجمه نمیگردد.
#elif مشابه دستور else if رفتار میکند و بصورت زیر استفاده میشود:
#if 1 عبارت شرطی
1 مجموعه دستورات
#elif عبارت شرطی2
مجموعه دستورات2
.
.
.
#elif n عبارت شرطی
n مجموعه دستورات
#endif
هر #elif بهمراه یک عبارت شرطی است که اگر نتیجه ارزیابی آن ارزش درستی داشته باشد مجموعه دستورات مربوط به آن ترجمه شده کنترل به دستور بعد از #endif برمیگردند وگرنه شرط های موجود در #elif های بعدی مورد بررسی قرار میگیرند. اگر هیچکدام از عبارات شرطی ذکر شده در این ساختار ارزش درستی نداشته باشند، هیچ یک از مجموعه دستورات 1 تا n ترجمه نخواهد شد.
حذف ماکروی تعریف شده
اگر در برنامه ماکرویی توسط دستور #define تعریف گردد، دستور #undef میتواند از یک نقطه دلخواه برنامه (ازجایی که این دستور قرار میگیرد) به بعد، تعریف ماکرو را بی اثر میسازد. این دستور بصورت <نام ماکرو> #undef بکار میرود.
خیییییییلی مطالبه تون باحال بود ممنون
ممنون از راهنمائی تون عالی بود
سلام اول تشکر بخاطر اینکه به زبان ساده دارید مطالب مقدماتی رو توضیح می دید.یه سیوال دارم اگر براتون مقدور هست پاسخ بدید شما در ابتدا نوشته اید " پیش پردازنده، نوعی مترجم است که دستورات توسعه یافته ای از یک زبان برنامه نویسی را گرفته، به دستورات قابل فهم برای کامپایلر همان زبان تبدیل میکند. " سیوال من این است که وقتی برنامه داره نوشته میشه اول برنامه برای کامپایلر توضیح داده میشه چطور باید کدهایی که نوشته می شوند رو بفهمه و ترجمه کنه به این صورت که مثلا به کامپایلر میگن دستورالعمل درک کد نوشته شده در فایل iostream وجود داره کامپایلر به این فایل مراجعه میکنه اون رو اسکن میکنه ،دستورالعمل مربوطه رو پیدا میکنه پس کامپایلر بوسیله این دستور هم کد رو میفهمه هم برای ماشین ترجمه اش میکنه ، با وجود این چرا نیازی بوده که پیش پردازنده رو ابداع کردند؟ وقتی امکان این هست که برای کامپایلر (مترجم ) بوسیله دستورالعمل هایی که من در بالا یه نمونش رو گفتم (iostream) نحوه تفسیر کد نوشته شده بوسیله کاربر رو توضیح داد چه ضرورتی ایجاب کرده که پیش پردازنده را بوجود بیاورند؟با تشکر - سلامت و موفق باشید.