تعریف ماکرو
ماکرو، نامی برای یک رشته است که این رشته می تواند ترکیبی از خروف ، ارقام
مقادیر ثابت ، توابع و غیره باشد . دستور پیش پردازنده # define برای تعریف
ماکرو استفاده می شود . این دستور قبل از تابع ()main به دو صورت بکار می رود
که یک روش آن بصورت زیر است :
<نام ماکرو> <رشته ># define
نام ماکرو همانند نام یک متغیر در C است که حداقل باید با رشته تعریف کننده
ماکرو ، یک فاصله داشته باشد و بهتر است جهت مشخص بودن در برنامه با حروف بزرگ
انتخاب شود . بعنوان مثال ، دستور # define MAX 20
موجب می شود تا مقدار ماکروی MAX در سرتاسر برنامه برابر با ۲۰ فرض شود .
یعنی در هر جای برنامه از ماکروی MAX استفاده شود مثل این است که از عدد ۲۰
استفاده شده است .
در مورد دستورات پیش پردازنده در زبان C ، باید این نکته را در نظر داشت که
آنها علیرغم سایر دستورات زبان C ، به ; ختم نمی شوند .
مثال ۱: برنامه ای که چگونگی استفاده از ماکروها را نشان می دهد. این برنامه
تعدادی عدد را از ورودی خوانده و مجموع آنها را محاسبه می کند ( اگر عددی که
وارد می شود ، منفی باشد ، برنامه متوقف می شود ) . #define program main)(
#define FLOAT float
#define WHILE while(
#define DO)
#define BEGIN {
#define end }
#define formatout “the sum is %8.2f\n”
PROGRAM
BEGIN
FLOAT data/sum=0.0;
scanf(FORMATIN/& data);
WHILE data>=0.0 DO
BEGIN
sum+=data;
scanf(FORMATIN/&data);
END
printf(FORMAOUT/SUM);
END
نمونه ای از خروجی برنامه مثال ۱ : enter a numbet: 12
enter a numbet: 45
enter a numbet: 83
enter a numbet-: 1
the sum is 140.00
در مثال ۱ بجای تابع اصلی ()mainاز PROGRAMز ، بجای {از BEGINز ، بجای } از END
و… استفاده شده است . بدیهی است که انتخاب این نام ها به نظر برنامه نویس
بستیگ دارد که می تواند هر چیز دیگری را بجای آنها انتخاب نماید .
مثال ۲: برنامه ای که با استفاده از علامت * ، مثلثی را در صفحه نمایش رسم
می کند . #define NUMLINE 5
#define BLANK ‘ ‘
#define ASTRISK ‘*’
#define NEWLINE ‘\n’
main)(
{
int l/le/s ;
1=1;
while( l<=NUMLINE)
{
le=1 ;
while( le++<=NUMLINE-1)
printf(“%c”/BLANK);
s=1;
while(s++<=2*1-1)
printf(“%c”/ASTRISK);
printf(“%c”/NEWLINE);
l++;
}
}
خروجی برنامه مثال ۲ : *
* * *
* * * * *
* * * * * * *
* * * * * * * * *
کاربرد دیگر دستور# define در تعریف ماکروهایی است که دارای پارامتر باشند.
در این مورد از دستور # define بصورت زیر استفاده می شود . # define READINT(I )scanf(“%d/&I)
تعریف ماکرو ، مشخص می کند که چه عملی باید توسط ماکرو انجام گیرد . اسامی
پارامترها متغیرهایی هستند که در حین اجرای ماکرو به آن منتقل می شوند . اگر
تعداد آنها بیش از یکی باشد ، با کاما از یکدیگر جدا می گردند . برخلاف توابع
در ماکروها نیازی به تعریف نوع پارامترها نیست . بعنوان مثال دستور # define READINT(I )scanf(“%d/&I)
ماکرویی بنام READINT تعریف میکند که دارای پارامترI است ، درهنگام فراخوانی
این ماکرو ( که توسط نام آن انجام می شود ) باید آرگومانی را ذکر کنیم . این
آرگومان در عبارت (“%d”/&I)scanf بجای متغیر I منظور شده و تابع scanf عددی را
از ورودی خوانده و در متغیری که بعنوان آرگومان ذکر شده است قرار می دهد . به
عنوان مثال اگر بخواهیم متغیری مثل distance رااز ورودی بخوانیم کافیست ماکروی
فوق را بصورت زیر فراخوانی کنیم : READINT( distance);
اگر تعریف ماکرو شامل عبارتی طولانی باشد ( به طوری که در یک خط قابل بیان
نباشد ) می توان آن را در دو یا چند خط ادامه داد . بدین منظور باید در انتهای
هر خط ناتمام ، از کاراکتر \(back slash() استفاده نمود . دستور زیر را در نظر
بگیرید : # define IS_EQU( y )y% 4==0 && y %100 != 0 || \
y%400=0
همانطور که در دستور فوق مشاهده می گردد در انتهای اولین خط ، از کاراکتر \
استفاده شد تا بتوان بقیه عبارت ماکرو را در خط بعدی تایپ نمود .
اگر ماکروی IS_EQU با پارامتری بنام year فراخوانی گردد ، این متغیر بجای y
قرار خواهد گرفت . یعنی فراخوانی : if( IS_EQU( year))
معادل دستور زیر است : if( year %4= 0 && year %100 != 0 || year %400 == 0)
در فراخوانی ماکروها باید دقت کافی بخرج داد تا از اجرای آنها نتیجه مطلوبی
بدست آید . بعنوان مثال ماکروی نوشته شده برای انجام عمل توان یک عدد را درنظر
بگیرید : # define SQURE( x )x*x
اکنون به دو فراخوانی ماکرو SQURE توجه نمایید : S= SQURE(b( )1)
( با فراخوانی فوق ، حاصل b*b در متغیری s قرار می گیرد که منظور برنامه نویس
برآورده می شود ) . S= SQURE(x+1( )2)
در اثر این فراخوانی ، عبارت x+1 * x+1 ارزیابی شده و نتیجه آن در s قرار
می گیرد که با توجه به تقدم عملگرها ( که تفدم عمل ضرب (*) بیشتر از تقدم عمل
جمع (+) است ) . نتیجه ارزیابی ، با توان عدد x+1 برابر نیست . برای رفع این
مشکل دو راه حل وجود دارد : راه حل اول x+1 را در یک متغیر قرار داده و سپس
آن متغیر را بعنوان پارامتر به ماکرو منتقل کرد . راه حل دوم ماکرو را طوری
تعریف نمود که از ایجاد این اشتباه جلوگیری شود : # define SQURE(( x )*( x))
اکنون اگر ماکروی فوق با x+1 فراخوانی گردد عبارت زیر حاصل می شود که نتیجه
ارزیابی آن ، صحیح است . S=(( x+1 )*( x+1))
مثال ۳: برنامه ای که با استفاده از یک ماکرو ، مساحت دایره ای را محاسبه
می نماید . # define PI 3.14159
# define AREA(X( )PI*X*X)
main)(
{
float radius ;
printf(“\n enter radius: ” );
scanf(“%f”/&radius );
printf(“\n area is:” );
printf(“%.2f “/AREA(radius ));
}
نمونه ای از خروجی برنامه مثال ۳ : en
دیدگاه خود را بیان کنید.
باید وارد سایت شده باشید برای دیدگاه دادن