زبان برنامه نویسی سی/ماکروها

ویکی‎کتاب، کتابخانهٔ آزاد
پرش به ناوبری پرش به جستجو
Gnome-go-last.svg
Gnome-go-first.svg

ماکروهای سراسری کدهایی هستند که بین دو _ یعنی به شکل __CODE__ داخل متن برنامه نوشته می‌شوند تا مطابق با آنچه تشریح می‌شود مقداری را بازگردانده یا اعمالی را آزاد یا ممنوع کنند که آنها را در ذیل می نویسیم :

__LINE__

این ماکرو شماره خطی را که در آن نوشته باشید در مبنای ۱۰ بازمی‌گرداند

__FILE__

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

__DATE__

با این ماکرو ، کامپایلر ، تاریخ کامپایل فایل متن شما را نمایش میدهد که به صورت : سال ( چهار رقمی ) روز ( دو رقمی ) ماه ( دو رقمی ) ؛ می باشد

__TIME__

نمایش زمان کامپایل فایل از طریق این کد ماکرو به واسطه کامپایلر ، فراهم می‌گردد که به صورت : ثانیه ( دو رقمی ) : دقیقه ( دو رقمی ) : ساعت ( دو رقمی ) ؛ می باشد

__STDC__

این ماکرو به عنوان خروجی بازمی‌گرداند که آیا کامپایلر بر اساس استاندارد زبان C می‌باشد یا خیر و پاسخ به صورت 0 و 1 نمایش داده خواهد شد ( 0 یعنی خیر و 1 یعنی آری )

__STDC_HOSTED__

مقدار خروجی این ماکرو به شما خواهد گفت که آیا کامپایلر از کتابخانه استاندارد C پشتیبانی می نماید یا خیر و همانند ماکروی پیشین با 0 و 1 پاسخ می‌دهد ( 0 یعنی خیر و 1 یعنی آری )

__STDC_VERSION__

این ماکرو مقداری را به عنوان خروجی بازمی‌گرداند که مقدار بازگردانده شده نمایش می‌دهد که کامپایلر با کدام استاندارد زبان C سازگار است . 199901L برای استاندارد سال ۹۹ ( ISO/IEC 9899:1999 ) و 201112L برای استاندارد سال ۲۰۱۱ و 201710L برای استاندارد C18 که در سال ۲۰۱۷ به تصویب رسید و به عنوان سی ۱۸ شناخته می‌شود می‌باشند

__func__

این ماکرو نام تابعی که در آن به کار رفته باشد را به عنوان خروجی ، تحت یک رشته ، باز می‌گرداند

__STDC_IEC_559__

این ماکرو مقدار 1 یا 0 را در ازای اینکه آیا تمام پردازش‌های ریاضی بر روی اعداد اعشاری را با استاندارد IEC 60559 انستیتوی جهانی مهندسین برق و الکترونیک انجام می‌شوند یا خیر باز می‌گرداند ( 1 یعنی آری و 0 یعنی خیر )

__STDC_IEC_559_COMPLEX__

این ماکرو همانند ماکروی قبلی است با این تفاوت که نشان می‌دهد تا تمام پردازش‌های ریاضی بر روی اعداد مختلط با استاندارد IEC 60559 انستیتوی جهانی مهندسین برق و الکترونیک انجام ‌می‌شوند یا خیر ( که مقدار 1 را در صورت مطابقت باز می‌گرداند و اگر مطابق با استاندارد نباشد مقدار 0 را باز می‌گرداند )

__STDC_ISO_10646__

این ماکرو مقداری را باز می‌گرداند که نشان می‌دهد کاراکترهای اضافه‌تر از ASCII را که در استاندراد ISO 10646 تعریف شده‌اند و کامپایلر از آنها پشتیابنی می‌کند متعلق به استاندارد کدام سال است . در گذشته بسیاری از کامپایلرها آن را نادیده می‌گرفتند اما بعد از استاندارد C11 کامپایلرهای مطرح مثل کلنگ ، جی‌سی‌سی و ویژوال استودیو اجازه استفاده از کاراکترهای یونیکد را می‌دهند . این مقدار به صورت yyyymmL یعنی ابتدا سال ( در چهار رقم ) و سپس ماه ( در دو رفم و ) یک L در انتهای آن می‌باشد

__STDC_MB_MIGHT_NEQ_WC__

این ماکرو مقداری را بازمی‌گرداند که نشان می‌دهد نوع داده کاراکتر در کامپایلر همان مقدار کاراکترهای wchar_t را دارد ؛ این مقدار یا 1 است که به معنای بلی می‌باشد و یا 0 به معنی خیر


دقت کنید : مابقی ماکروهایی که در ذیل نوشته می‌شوند فقط در C11 و C18 تعریف شده‌اند


__STDC_LIB_EXT1__

ماکروی اختصاصی مایکروسافت که به اصرار این کمپانی به استاندارد C افزوده شد و برای چک کردن عدم تداخل مقدارهای داده شده به متغیرها با طیف قابل ذخیره در هر نوع از متغیر می‌باشد ( Bound Checking ) که بسیاری از کامپایلرها از آن پشتیبانی نمی‌کنند ولی Visual Studio از مایکروسافت آن را به رسمیت می‌شناسد ( در صورتی که مقدار 1 را بازگرداند یعنی کامپایلر پشتیبانی می‌کند و در صورتی که 0 را بازگرداند یعنی پشتیبانی نمی‌کند )

__STDC_WANT_LIB_EXT1__

در صورتی که شک داشتید کامپایلر شما از annex K (Bounds-checking interfaces) با ماکروی پیشین یعنی __STDC_LIB_EXT1__ استفاده می‌کند یا خیر و یا در Visual Studio خواستید آن را از کار بیاندازید ماکروی فعلی را با کمک دستور مستقیم پیش پردازنده define مقدار 0 بدهید تا احیاناً توابع از پیش تعریف شده آن با کدهای شما تداخل نیابند و اگر خواستید آن را فعال کنید به آن مقدار 1 بدهید

__STDC_NO_ATOMICS__

این ماکرو در صورتی که مقدار 1 را بازگرداند یعنی از نوع داده‌های اتمی و فایل سرآیند stdatomic.h پشتیبانی نمی‌کند و در صورتی بازگرداندن 0 به شما می‌گوید که پشتیبانی می‌کند ، ممکن است این ماکرو تعریف نشده باشد ؛ در صورتی که کامپایلر با استاندارد C11 یا C18 مطابقت می‌کند ، یعنی از نوع داده‌های اتمی پشتیبانی می‌کند

__STDC_NO_COMPLEX__

این ماکرو با بازگرداندن عدد 1 نشان می‌دهد که از نوع داده‌های مختلط و فایل سرآیند stdcomplex.h پشتیبانی نمی‌کند و در صورت بازگرداندن 0 نشان می‌دهد که پشتیبانی می‌کند ؛ در صورتی که کامپایلر با استاندارد C11 یا C18 مطابقت می‌کند ، یعنی از نوع داده‌های مختلط پشتیبانی می‌کند

__STDC_NO_THREADS__

این ماکرو با بازگرداندن عدد 1 نشان می‌دهد که از برنامه‌نویسی برای ریسه‌ها و فایل سرآیند stdthreads.h پشتیبانی نمی‌کند و در صورت بازگرداندن عدد 0 نشان می‌دهد که پشتیبانی می‌کند ؛ در صورتی که کامپایلر با استاندارد C11 یا C18 مطابقت می‌کند ، یعنی از نوع داده‌ها و برنامه‌نویسی برای ریسه‌ها پشتیبانی می‌کند

__STDC_NO_VLA__

این ماکرو با بازگرداندن عدد 1 نشان می‌دهد که از آرایه‌هایی با اندیس‌های نامعین و داده‌هایی که مقدار آرایه‌های با اندیس نامعین را دارند ، پشتیبانی نمی‌کند و بازگرداندن عدد 0 نمایانگر پشتیبانی کامپایلر از این نوع داده‌ها می‌باشد ؛ در صورتی که این ماکرو در کامپایلر شما تعریف نشده باشد و کامپایلر با استاندارد C11 یا C18 سازگاری داشته باشد ، یعنی از نوع داده VLA به معنی آرایه‌هایی با اندیس‌های نامعین و داده‌هایی که شامل آنها هستند (Variable-length array) پشتیبانی می‌کند

استفاده :

لازم نیست فعلاً کد زیر را کاملاً درک کنید ، به صورت خلاصه می‌نویسیم که تابع کتابخانه‌ای printf در فایل سرآیند stdio تعریف شده است و در اینجا آن را احضار می‌کنیم تا در خروجی خط‌دستوری برنامه مقدار بازگردانده شده توسط ماکروهای بالا را نمایش دهد

#include<stdio.h>

int main(void)
{
	printf("%d\n", __STDC_IEC_559__);
	return 0;
}

این نمونه مقدار بازگردانده شده توسط STDC_IEC_559 را به صورت خط‌دستوری پس از کامپایل و اجرای برنامه ، نمایش خواهد داد . شما هر ماکرویی را که خواستید امتحان کنید که با استاندارد C98 یا C99 یا C11 یا C18 سازگار است جایگزین STDC_IEC_559 کنید ، در یک فایل متنی با پسوند c. ذخیره کنید تا خروجی را پس از کامپایل به برنامه و اجرای آن از طریق ترمینال سیستم عامل خود ، نتیجه را مشاهده کنید ( ترمینال در سیستم عامل های شبه‌یونیکس و cmd به معنی commander در ویندوز )