Macros and its types in C/C++

A macro is a piece of code in a program that is replaced by the value of the macro. Macro is defined by #define directive. Whenever a micro name is encountered by the compiler, it replaces the name with the definition of the macro. Macro definitions need not be terminated by semi-colon(;).

Below are the program to illustrate the use of macros in C/C++:

Program 1:

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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;
}
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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;
}
chevron_right

Output:
The value of LIMIT is 5

Program 2:



filter_none

edit
close

play_arrow

link
brightness_4
code

// 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;
}
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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;
}
chevron_right

Output:
Area of rectangle is: 50

Explanation:
From the above program we can see that whenever the compiler finds AREA(l, b) in the program it replaces it with the macros defination i.e., (l*b). The values passed to the macro template AREA(l, b) will also be replaced by the statement (l*b). Therefore, AREA(10, 5) will be equal to 10*5.

Types Of Macros

  1. Object-like Macros: An object-like macro is a simple identifier which will be replaced by a code fragment. It is called object-like because it looks like an object in code that uses it. It is popularly used to replace a symbolic name to numerical/variable represented as constant.

    Below is the illustration of a simple macro:

    filter_none

    edit
    close

    play_arrow

    link
    brightness_4
    code

    // 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;
    }
    chevron_right
    
    
    filter_none

    edit
    close

    play_arrow

    link
    brightness_4
    code

    // 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;
    }
    chevron_right
    
    
    Output:
    Lockdown will be extended upto 31-MAY-2020
    
  2. Chain Macros: Macros inside macros are termed as chain macros. In chain macros first of all parent macro is expand then child macro is expanded.

    Below is the illustration of a Chain Macro:

    filter_none

    edit
    close

    play_arrow

    link
    brightness_4
    code

    // 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;
    }
    chevron_right
    
    
    filter_none

    edit
    close

    play_arrow

    link
    brightness_4
    code

    // 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 %dK"
             << " followers on Instagram!"
             << INSTAGRAM;
      
        return 0;
    }
    chevron_right
    
    
    Output:
    Geeks for Geeks have 138K followers on Instagram!
    

    Explanation:
    INSTAGRAM is expanded first to produce FOLLOWERS. Then the expanded macro is expanded to produce the outtcome as 138. This is called the chaining of macros.

  3. Multi-line Macros: An object-like macro could have a multi-line. So to create a multi-line macro you have to use backslash-newline.
    Below is the illustration of multiline macros:
    filter_none

    edit
    close

    play_arrow

    link
    brightness_4
    code

    // 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;
    }
    chevron_right
    
    
    filter_none

    edit
    close

    play_arrow

    link
    brightness_4
    code

    // 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;
    }
    chevron_right
    
    
    Output:
    Elements of Array are:
    1  2  3
    
  4. Function-like Macro: These macros are the same as a function call. It replaces the entire code instead of a function name. Pair of parentheses immediately after the macro name is necessary. If we put a space between the macro name and the parentheses in the macro definition then the macro will not work.
    A function-like macro is only lengthened if an only if its name appears with a pair of parentheses after it. If we don’t do this, the function pointer will get the address of the real function and lead to a syntax error.

    Below is the illustration of function-like macros:

    filter_none

    edit
    close

    play_arrow

    link
    brightness_4
    code

    // 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;
    }
    chevron_right
    
    
    filter_none

    edit
    close

    play_arrow

    link
    brightness_4
    code

    // 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;
    }
    chevron_right
    
    
    Output:
    Minimum value between 18 and 76 is 18
    

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.






If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.


Article Tags :
C
Practice Tags :