PDA

View Full Version : مبتدی: سوال درباره ماکرو ها



raminlich
پنج شنبه 24 مهر 1393, 13:34 عصر
سلام به همگی
این ماکرو های چین کلن یه سرچی زدم پیدا هم کردم نفهمیدم
مثلا ماکرو __DATE__ می دونم چی کار میکنه ولی هنوز نگرفتمش.
کلا ماکرو ها چین؟
یه سوال دیگه این خط یعنی چه؟
int _var
int که هیچ می دونم ولی اون آندرلاین برای چیه؟؟:متفکر:
مممنون

کامبیز اسدزاده
پنج شنبه 24 مهر 1393, 15:09 عصر
سلام به همگی
این ماکرو های چین کلن یه سرچی زدم پیدا هم کردم نفهمیدم
مثلا ماکرو __DATE__ می دونم چی کار میکنه ولی هنوز نگرفتمش.
کلا ماکرو ها چین؟
یه سوال دیگه این خط یعنی چه؟
int _var
int که هیچ می دونم ولی اون آندرلاین برای چیه؟؟:متفکر:
مممنون

تا چایی که یادمه یه توضیحاتی در بخش کیوت داده بودم در رابطه با Macro ها برای C++
در C++ ما تکه کد هایی داریم به با که با عنوان ماکرو معروفند...معمولا با نام های خاص و مشخصی تعریف شده اند و میتوان در بین کد ها ازشون استفاده کرد.

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

نمونه مثالی قبلا در رابطه با این ماکروها دادم بررسی کنید : http://barnamenevis.org/showthread.php?463180-%D9%85%D8%B9%D8%B1%D9%81%DB%8C-4-%D9%85%D8%A7%DA%A9%D8%B1%D9%88%DB%8C-%D9%BE%D8%B1-%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%D8%AF-%D9%88-%D8%A7%D8%B2-%D9%BE%DB%8C%D8%B4-%D8%AA%D8%B9%D8%B1%DB%8C%D9%81-%D8%B4%D8%AF%D9%87

rahnema1
پنج شنبه 24 مهر 1393, 16:42 عصر
در تکمیل مباحث بالا
ماکرو یکی از دستورات پیش پردازنده هست.این دستورات باعث میشه تغییراتی در کدهایی که نوشتیم اتفاق بیفته قبل از اینکه توسط کامپایلر تبدیل به برنامه اجرایی بشه
یک ماکرو به این صورت نوشته میشه
#define identifier replacement-list
که باعث میشه هر جا که در متن کد ما identifier قرار گرفته باشه به جای اون replacement-list قرار بگیره
که identifier همون نام ماکرو هست و replacement-list هم بهش لیست جایگزینی میگن
مثلا در کد زیر

#define PI 3.14
int main()
{
double a= 34.789;
double b= a * PI;
}

یک ماکرو به نام PI تعریف کردیم که هر جا که در برنامه نوشته باشیم PI به جای اون 3.14 قرار می گیره که در مرحله پیش پردازش به این صورت در می آد :

int main()
{
double a = 34.789;
double b = a * 3.14;
}

سپس این کد جدید به برنامه اجرایی تبدیل میشه
این شکل ماکرو که در بالا نوشتیم بهش ماکرو شیء میگن یک رقم دیگه هم ماکرو داریم که به اونها ماکرو تابع میگن که شکل ساده تعریف اون به این صورته
#define identifier ( parameters) replacement-list
مثلا کد زیر

#define SUM(a,b) a+b
int main()
{
double a = 34.789;
double b = 123.456;
double c = SUM(a,b);
}

به این صورت تبدیل می شه

int main()
{
double a = 34.789;
double b = 123.456;
double c = a+b;
}

یک سری ماکرو هست که مطابق استاندارد باید در هر کامپایلر ++c از قبل تعریف شده باشه که عبارتند از

__cplusplus
__DATE__
__FILE__
__LINE__
__STDC_HOSTED__
__TIME__

ضمنا undef باعث میشه یک شناسه دیگه به عنوان ماکرو شناخته نشه
#undef identifier
در خصوص _ اندرلاین هم تنها حرفی غیر از حروف الفبا و اعداد هست که می تونه به عنوان نام متغیر یا شناسه استفاده بشه

int rahnema_1 =2;
int r_a_h111435ne___ma1____ =2;

حالا اگه یه برنامه نوشته باشید بخواهید بفهمید در مرحله پیش پردازش چه تغییراتی در اون کد اعمال میشه با ++g می تونید این را بزنید تا خروجی شده یک فایل سورس به نام preprocessed.cpp با تغییرات اعمل شده خواهد بود
g++ myprog.cpp -E -o preprocessed.cpp