بایگانی

نوشته‌هایی که ‘lexical analysis’ برچسب زده شده‌اند

دستورالعمل‌های پیش‌پردازشی #C چیستند؟

اکتبر 7, 2010 7 دیدگاه

دستورالعمل‌های پیش‌پردازشی به ما این قابلیت را می‌دهند که به صورت شرطی عملیات کامپایل کردن را انجام دهیم یعنی قابلیت نادیده گرفتن شرطی بخشی از فایل‌های منبع، قرار دادن شرط برای تولید خطا و هشدار، و مشخص کردن بخشی مجزا از کد منبع را برای ما مهیا می‌کنند. واژه «دستورالعمل‌های پیش‌پردازشی» فقط برای همسانی با زبان‌های برنامه‌نویسی C  و ++C به کار برده شده‌اند. در #C هیچ مرحله مجزایی به عنوان مرحله قبل از پردازش وجود ندارد و این دستورالعمل‌ها در بخشی از فاز تحلیل لغوی (lexical analysis phase) زبان، پردازش می‌شوند.

 

در #C دستورالعمل‌های پیش‌پردازشی زیر موجود هستند:

۱- define# و undefine# : به ترتیب برای تعریف و حذف کردن علامت‌های قابل فهم برای کامپایل شرطی استفاده میذشوند.

۲- if# و elif# و else# و endif# : این‌ها عباراتی هستند که با استفاده از آن‌ها می‌توانیم به صورت شرطی به کامپایلر بفهمانیم که بخشی از کد منبع را در عملیات کامپایل کردن نادیده بگیرد.

۳-  line# : که برای کنترل کردن شماره خطوطی که برای خطاها و هشدارها منتشر شده‌اند.

۴- error# و warning# : به ترتبب برای صادر کردن خطاها و هشدارها استفاده می‌شوند.

۵- region# و endregion# : برای مشخص و مجزا کردن بخشی از کد منبع باشد.فکر میکنم از این دستورالعمل بیش از بقیه استفاده می‌شود.

 

به تکه کد زیر دقت کنید :

#define A
#undef B
class C
{
#if A
void F() {}
#else
void G() {}
#endif
#if B
void H() {}
#else
void I() {}
#endif
}

این تکه کد در زمان کامپایل معادل کد زیر کامپایل می‌شود :

class C
{
void F() {}
void I() {}
}

این دو اگرچه از لحاظ لغوی کاملا با هم متفاوتند ولی از دید قواعد نحوی کاملا معادل یکدیگر می‌باشند.

در اینجا برای فهم بهتر کامپایل شرطی مثالی می‌زنم تا موضوغ قابل فهم‌تر باشد. فرض کنید می‌خواهیم یکی از سرویس‌های نوشته شده توسط ما، در یکی از dll های برنامه‌مان به صورت شرطی دو رفتار مختلف نشان دهد. مثلا این سرویس باید برای دو شرکت خریدار محصول ما متفاوت باشد و برای هر کدام نیاز داریم یک dll مجزا تولید کنیم، در عین حال نمی‌خواهیم به ازای هر کدام یک متد جدا داشته باشیم، در اینجا می‌توانیم از دستورالعمل if# و else# و endif# استفاده کنیم و کامپایل شدن dll را به یک پارامتر وابسته نماییم. این پارامتر را هم می‌توان به کمک define# تعریف کرد و هم می‌توان از بخش properties مربوط به پروژه که به یک dll تبدیل خواهد شد این کار را انجام داد. برای روش دوم باید از صفحه ظاهر شده روی لبه‌ی Build کلیک کرد و در بخش Conditional compilation symbols آن را تعریف می‌کنیم، مثلا می‌توانیم از نام شرکت مورد نظر به عنوان این علامت استفاده کرد.

دنبال‌کردن

هر نوشتهٔ تازه‌ای را در نامه‌دان خود دریافت نمایید.