Multiline macros in C

28 May, 2017
In this article, we will discuss how to write a multi-line macro. We can write multi-line macro same like function, but each statement ends with “\”. Let us see with example. Below is simple macro, which accepts input number from user, and prints whether entered number is even or odd.
#include <stdio.h>  #define MACRO(num, str) {\            printf("%d", num);\            printf(" is");\            printf(" %s number", str);\            printf("\n");\           }  int main(void){    int num;      printf("Enter a number: ");    scanf("%d", &num);      if (num & 1)        MACRO(num, "Odd");    else        MACRO(num, "Even");      return 0;}
At first look, the code looks OK, but when we try to compile this code, it gives compilation error.
[narendra@/media/partition/GFG]$ make macro
cc     macro.c   -o macro
macro.c: In function ‘main’:
macro.c:19:2: error: ‘else’ without a previous ‘if’
make: *** [macro] Error 1
[narendra@/media/partition/GFG]$ 

Let us see what mistake we did while writing macro. We have enclosed macro in curly braces. According to C-language rule, each C-statement should end with semicolon. That’s why we have ended MACRO with semicolon. Here is a mistake. Let us see how compile expands this macro.
if (num & 1)
{
    -------------------------
    ---- Macro expansion ----
    -------------------------
};    /* Semicolon at the end of MACRO, and here is ERROR */

else 
{
   -------------------------
   ---- Macro expansion ----
   -------------------------

};

We have ended macro with semicolon. When compiler expands macro, it puts semicolon after “if” statement. Because of semicolon between “if and else statement” compiler gives compilation error. Above program will work fine, if we ignore “else” part.
To overcome this limitation, we can enclose our macro in “do-while(0)” statement. Our modified macro will look like this.
#include <stdio.h>  #define MACRO(num, str) do {\            printf("%d", num);\            printf(" is");\            printf(" %s number", str);\            printf("\n");\           } while(0)  int main(void){    int num;      printf("Enter a number: ");    scanf("%d", &num);      if (num & 1)        MACRO(num, "Odd");    else        MACRO(num, "Even");      return 0;}
Compile and run above code, now this code will work fine.
[narendra@/media/partition/GFG]$ make macro
cc     macro.c   -o macro
[narendra@/media/partition/GFG]$ ./macro 
Enter a number: 9
9 is Odd number
[narendra@/media/partition/GFG]$ ./macro 
Enter a number: 10
10 is Even number
[narendra@/media/partition/GFG]$ 

We have enclosed macro in “do – while(0)” loop and at the end of while, we have put condition as “while(0)”, that’s why this loop will execute only one time.
Similarly, instead of “do – while(0)” loop we can enclose multi-line macro in parenthesis. We can achieve the same result by using this trick. Let us see example.
#include <stdio.h>  #define MACRO(num, str) ({\            printf("%d", num);\            printf(" is");\            printf(" %s number", str);\            printf("\n");\           })  int main(void){    int num;      printf("Enter a number: ");    scanf("%d", &num);      if (num & 1)        MACRO(num, "Odd");    else        MACRO(num, "Even");      return 0;}
[narendra@/media/partition/GFG]$ make macro
cc     macro.c   -o macro
[narendra@/media/partition/GFG]$ ./macro 
Enter a number: 10
10 is Even number
[narendra@/media/partition/GFG]$ ./macro 
Enter a number: 15
15 is Odd number
[narendra@/media/partition/GFG]$ 

This article is compiled by Narendra Kangralkar. Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.
C-Macro & Preprocessor
C Language
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.