ماکرو‌ها و انواع آن در ++C/C

Macros and Its Types in C/C Plus Plus

01 اسفند 1400
macros-in-c-plus-plus

یک ماکرو (‌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.

انواع ماکرو‌ها

1. ماکرو‌های شئ‌مانند (Object-like Macros)

یک ماکرو شئ‌مانند یک شناسه‌ی ساده است که توسط یک قطعه‌کُد جایگزین خواهند شد. به این خاطر شیئ‌مانند (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

2. زنجیر‌ماکرو‌ها (Chain Macros)

ماکرو‌ها داخل ماکرو‌ها تحت عنوان زنجیر ماکرو‌ها هستند. در زنجیره‌ی ماکرو‌ها اول از همه، ماکرو والد گسترش داده می‌شود و سپس ماکرو فرزند گسترش داده شده است.

قطعه‌کُد زیر، یک زنجیره‌ی ماکرو را در زبان 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. این را زنجیره‌ی ماکرو‌ها می‌خوانیم.

3. ماکرو‌های چند‌خطی (Multi-line Macros)

یک ماکرو شئ‌مانند (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

4. ماکرو‌های تابع‌مانند (Function-like Macro)

این‌ ماکرو‌ها شبیه‌ به فراخوانی تابع هستند. این ماکرو‌ها کُد کامل را به جای نام تابع جایگزین می‌کنند. جُفت‌پرانتز بعد از نام ماکرو ضروری است. اگر یک فضا بین نام ماکرو و پرانتز‌ها در تعریف ماکرو قرار دهیم، ماکرو دیگر کار نخواهد کرد. یک ماکرو شئ‌مانند اگر تنها اگر نامش با جفُت‌پرانتز بعد از آن بیاید، طولانی می‌شود. اگر این کار صورت نگیرد، اشاره‌گر تابع، آدرس تابع واقعی را گرفته و منجر به یک خطای نحو (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

نویسنده شوید
دیدگاه‌های شما

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.