معرفی پیش پردازنده و دستورات آن در کامپایلر سی پلاس پلاس

پیش پردازنده و دستورات آن در سی پلاس پلاس [بخش اول]

زمانی که نیاز داشته باشید قبل از کامپایل شدن کدهای خودتان، برنامه دیگری اجرا شده و وظیفه مشخصی را برایتان به انجام برساند، استفاده از پیش پردازنده بهترین راه حل است! با ما در اوپن مایند همراه شوید تا با پیش پردازنده و دستورات آن آشنا شویم.

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

زمانی که پیش پردازنده قبل از عملیات کامپایل کد سی پلاس پلاس اجرا می شود، تمام فایل های پروژه شما را از بالا به پایین اسکن می کند و به دنبال به اصطلاح “دستور العمل” ها (directives) می گردد. دستورالعمل ها، کدهای مشخصی هستند که هر خط آن ها با علامت # (شارپ) آغاز می شود و با کاراکتر نیولاین (اینتر) پایان می پذیرد (نه با سمی کالن). البته اگر می خواهید تعریف دستورالعمل پیش پردازنده ای خود را به بیش از یک خط گسترش دهید،  در پایان یک خط ابتدا یک بک اسلش ( \ ) بزنید سپس نیولاین را وارد کنید (بک اسلش قبل از زدن اینتر).

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

دستورات پیش پردازنده:

دستورات Include

در حال حاضر که این مطلب را می خوانید، احتمالاً از قبل برنامه های سی پلاس پلاس دستور  include# را دیده اید. زمانی که شما یک فایل را در برنامه فایل کدهای تان به اصطلاح اینکلود می کنید، برنامه پیش پردازنده یک کپی از محتوای فایل اینکلود شده را در همان نقطه از برنامه شما جایگذاری می کند.

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

دستورالعمل  include# دو شکل استفاده متفاوت دارد:

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

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

 

در این شکل به جای استفاده از علامات <> از ” ” استفاده شده است؛ که در این صورت، پیش پردازنده برای یافتن فایل اینکلود شده، در پوشه ای که فایل منبع کد (source code) در آن قرار دارد جستجو می کند. در صورتی که فایل را در آن مسیر پیدا نکند، در مسیرهای اینکلودی که برای پروژه در کامپایلر/IDE تعریف کرده اید، به دنبال ان خواهد گشت.

معمولاً، این فرم از دستور include برای وارد کردن فایل های کدی که در فایلی جدا نوشته اند، استفاده می شود (مثل وارد کردن تعریف کلاس ها).

تعریف ماکرو با دستور define

دستورالعمل  define# می تواند برای تعریف یک ماکرو استفاده شود. اما تعریف ماکرو (Macro) :
ماکرو ضابطه ای است برای تعریف نحوه جایگزینی یک دنباله از ورودی ها (مثلاً یک identifier) با یک دنباله از خروجی ها (مثلاً یک identifier دیگر یا متن)

دو نوع مختلف از تعریف ماکروها وجود دارد: ماکروهای شبیه به شئ (object-like) و ماکروهای شبیه به تابع (function-like)

ماکروهای شبیه به شئ (object-like):

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

تعریف اول مقداری برای جایگزینی ندارد؛ توجه کنید که این نوع تعریف ماکرو، برای ایجاد دستورات شرطی پیش پردازنده استفاده می شود.
اما در حالت تعریف دوم، وقتی پیش پردازنده به این دستورالعمل می رسد، تمام “identifier” موجود در ادامه کد را با مقدار “substitution_value” جایگزین می کند. قطعه کد زیر را در نظر بگیرید:

پیش پردازنده کد خط سوم را به شکل زیر جایگزین و تبدیل می کند و سپس کامپایلر آن را به کد ماشین کامپایل می کند.

که البته بعد از اجرا خروجی به شکل  My favorite number is: 80 خواهد بود.

 

در اینجا ذکر این نکته هم لازم است که با دستور  undef# می توان تعریف مقدار یک ماکرو را پاک کرد. مثال بالا را با کمی تغییر در ادامه تکرار می کنیم تا نحوه استفاده از  undef# هم برای شما روشن شود.

خروجی اجرای این کد به شکل زیر خواهد بود:

ماکروهای شبیه به تابع (function-like):

ماکروهای شبیه به تابع مانند یک تابع عمل می کنند و برای مقاصد مشابه نوشته و استفاده می شوند. ما درباره این نوع ماکروها بحث چندانی نخواهیم کرد؛ چرا که استفاده از این نوع ماکروها پیشنهاد نمی شود. ماکروهای شبه تابع در هنگام اجرا می توانند عملکردهای عجیب و غیر منتظره ای داشته باشند. همچنین هر کاری که با این ماکروها قابل انجام است، با یک تابع inline هم قابل انجام است. بنابراین تنها به ذکر یک مثال اکتفا می کنیم:

 

در بخش دوم این مطلب آموزشی دستورالعمل های شرطی و ماکروهای از قبل تعریف شدۀ پیش پردازنده را بررسی می کنیم.

نظر خود را بنویسید.

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