یک ماکرو (macro)، یک قطعه از کُد در برنامه است که توسط مقدار ماکرو جایگزین شده است. ماکرو با دستور define# تعریف میشود. هرگاه که کامپایلر به نام یک ماکرو برخورد کند، کامپایلر، نام را با تعریف ماکرو جایگزین میکند. در هنگام تعریف ماکرو نیازی به استفاده از سِمیکالن ( ; ) در پایان آن نیست. در قطعهکُد زیر میتواند نحوهی استفاده از ماکروها را در ++C/C، مشاهده کنید:
قطعهکُد زیر مربوط به تعریف ماکرو در زبان C است:
// C program to illustrate macros #include <stdio.h> // Macro definition #define LIMIT 5 // Driver Code int main() { // Print the value of macro defined printf("The value of LIMIT" " is %d", LIMIT); return 0; }
در زبان ++C هم به این صورت خواهد بود:
// C++ program to illustrate macros #include <iostream> using namespace std; // Macro definition #define LIMIT 5 // Driver Code int main() { // Print the value of macro defined cout << "The value of LIMIT" << " is " << LIMIT; return 0; }
خروجی قطعهکُدهای بالا به این صورت است:
The value of LIMIT is 5
مثال دوم از ماکروها:
قطعهکُد زیر در زبان C است:
// C program to illustrate macros #include <stdio.h> // Macro definition #define AREA(l, b) (l * b) // Driver Code int main() { // Given lengths l1 and l2 int l1 = 10, l2 = 5, area; // Find the area using macros area = AREA(l1, l2); // Print the area printf("Area of rectangle" " is: %d", area); return 0; }
و در زبان ++C هم به این صورت خواهد بود:
// C++ program to illustrate macros #include <iostream> using namespace std; // Macro definition #define AREA(l, b) (l * b) // Driver Code int main() { // Given lengths l1 and l2 int l1 = 10, l2 = 5, area; // Find the area using macros area = AREA(l1, l2); // Print the area cout << "Area of rectangle" << " is: ", area; return 0; }
خروجی قطعهکُد بالا به این صورت است:
Area of rectangle is: 50
توضیح قطعهکُد بالا: از قطعهکُدهای بالا میتوانیم متوجه شویم که هر زمان که کامپایلر در برنامه، به AREA(l, b) برخورد کند، کامپایلر، آن را با تعریف ماکرو جایگزین میکند، به عنوان مثال (l*b). مقادیر ارسالشده به الگوی AREA(l, b) ماکرو، با عبارت (l*b) جایگزین خواهد شد. بنابراین AREA(10, 5) برابر است با 10*5.
یک ماکرو شئمانند یک شناسهی ساده است که توسط یک قطعهکُد جایگزین خواهند شد. به این خاطر شیئمانند (object-like) نامیده شده است که شبیه به یک شئ در قطعهکُد که در آن استفاده شده است، هست. ماکروهای شئمانند عموما برای جایگزین کردن یک نام با عدد/متغیر ارائهشده به عنوان ثابت ( constant ) استفاده شدهاند.
قطعهکُد زیر، این موضوع را نشان میدهد که در زبان C است:
// C program to illustrate macros #include <stdio.h> // Macro definition #define DATE 31 // Driver Code int main() { // Print the message printf("Lockdown will be extended" " upto %d-MAY-2020", DATE); return 0; }
قطعهکُد برای زبان ++C هم به این صورت است:
// C++ program to illustrate macros #include <iostream> using namespace std; // Macro definition #define DATE 31 // Driver Code int main() { // Print the message cout << "Lockdown will be extended" << " upto " << DATE << "-MAY-2020"; return 0; }
خروجی قطعهکُدهای بالا به این صورت است:
Lockdown will be extended upto 31-MAY-2020
ماکروها داخل ماکروها تحت عنوان زنجیر ماکروها هستند. در زنجیرهی ماکروها اول از همه، ماکرو والد گسترش داده میشود و سپس ماکرو فرزند گسترش داده شده است.
قطعهکُد زیر، یک زنجیرهی ماکرو را در زبان C به تصویر میکشد:
// C program to illustrate macros #include <stdio.h> // Macro definition #define INSTAGRAM FOLLOWERS #define FOLLOWERS 138 // Driver Code int main() { // Print the message printf("Geeks for Geeks have %dK" " followers on Instagram", INSTAGRAM); return 0; }
قطعهکُد به زبان ++C به این صورت است:
// C++ program to illustrate macros #include <iostream> using namespace std; // Macro definition #define INSTAGRAM FOLLOWERS #define FOLLOWERS 138 // Driver Code int main() { // Print the message cout << "Geeks for Geeks have " << INSTAGRAM << "K followers on Instagram!"; return 0; }
خروجی قطعهکُدهای بالا به این صورت است:
Geeks for Geeks have 138K followers on Instagram!
توضیح قطعهکُد بالا: INSTAGRAM ابتدا گسترش دادهشده است برای تولید FOLLOWERS. سپس ماکرو گسترش دادهشده، گسترشداده شده است برای تولید نتیجه 138. این را زنجیرهی ماکروها میخوانیم.
یک ماکرو شئمانند (object-like) میتواند، چندخطی باشد. بنابراین برای ایجاد یک ماکرو چندخطی باید از بَکاِسلش - خطجدید یا backslash-newline استفاده کنید.
قطعهکُد زیر را که در زبان C است را برای درک بهتر این موضوع مشاهده کنید:
// C program to illustrate macros #include <stdio.h> // Multi-line Macro definition #define ELE 1, \ 2, \ 3 // Driver Code int main() { // Array arr[] with elements // defined in macros int arr[] = { ELE }; // Print elements printf("Elements of Array are:\n"); for (int i = 0; i < 3; i++) { printf("%d ", arr[i]); } return 0; }
در زبان ++C هم به این صورت است:
// C++ program to illustrate macros #include <iostream> using namespace std; // Multi-line Macro definition #define ELE 1, \ 2, \ 3 // Driver Code int main() { // Array arr[] with elements // defined in macros int arr[] = { ELE }; // Print elements printf("Elements of Array are:\n"); for (int i = 0; i < 3; i++) { cout << arr[i] << ' '; } return 0; }
خروجی قطعهکُد بالا به این صورت است:
Elements of Array are: 1 2 3
این ماکروها شبیه به فراخوانی تابع هستند. این ماکروها کُد کامل را به جای نام تابع جایگزین میکنند. جُفتپرانتز بعد از نام ماکرو ضروری است. اگر یک فضا بین نام ماکرو و پرانتزها در تعریف ماکرو قرار دهیم، ماکرو دیگر کار نخواهد کرد. یک ماکرو شئمانند اگر تنها اگر نامش با جفُتپرانتز بعد از آن بیاید، طولانی میشود. اگر این کار صورت نگیرد، اشارهگر تابع، آدرس تابع واقعی را گرفته و منجر به یک خطای نحو (syntax error) خواهد شد.
برنامهی زیر ماکروهای شئمانند را در زبان C نمایش میدهد:
// C program to illustrate macros #include <stdio.h> // Function-like Macro definition #define min(a, b) (((a) < (b)) ? (a) : (b)) // Driver Code int main() { // Given two number a and b int a = 18; int b = 76; printf("Minimum value between" " %d and %d is %d\n", a, b, min(a, b)); return 0; }
همچنین در زبان ++C هم به این صورت است:
// C++ program to illustrate macros #include <iostream> using namespace std; // Function-like Macro definition #define min(a, b) (((a) < (b)) ? (a) : (b)) // Driver Code int main() { // Given two number a and b int a = 18; int b = 76; cout << "Minimum value between" << a << " and " << b << " is: " << min(a, b); return 0; }
خروجی قطعهکُدهای بالا به این صورت است:
Minimum value between 18 and 76 is 18
منبع: وب سایت geeksforgeeks
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.