Macros multilínea en C

En este artículo, discutiremos cómo escribir una macro de varias líneas. Podemos escribir una macro de varias líneas igual que la función, pero cada declaración termina con «\». Veamos con ejemplo. A continuación se muestra una macro simple, que acepta el número ingresado por el usuario e imprime si el número ingresado es par o impar.

#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;
}

A primera vista, el código se ve bien, pero cuando tratamos de compilar este código, da un error de compilación.

[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]$ 

Veamos qué error cometimos al escribir la macro. Hemos encerrado la macro entre llaves. De acuerdo con la regla del lenguaje C, cada declaración C debe terminar con un punto y coma. Por eso hemos terminado MACRO con punto y coma. Aquí hay un error. Veamos cómo compile expande esta macro.

if (num & 1)
{
    -------------------------
    ---- Macro expansion ----
    -------------------------
};    /* Semicolon at the end of MACRO, and here is ERROR */

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

};

Hemos terminado macro con punto y coma. Cuando el compilador expande la macro, coloca un punto y coma después de la declaración «si». Debido al punto y coma entre la declaración «if y else», el compilador da un error de compilación. El programa anterior funcionará bien, si ignoramos la parte «else».

Para superar esta limitación, podemos incluir nuestra macro en la instrucción «do-while(0)». Nuestra macro modificada se verá así.

#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 y ejecute el código anterior, ahora este código funcionará bien.

[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]$ 

Hemos encerrado la macro en el bucle «do – while (0)» y al final de while, hemos puesto la condición como «while (0)», es por eso que este bucle se ejecutará solo una vez.

De manera similar, en lugar del bucle «do – while (0)», podemos encerrar una macro de varias líneas entre paréntesis. Podemos lograr el mismo resultado usando este truco. Veamos ejemplo.

#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]$ 

Este artículo fue compilado por Narendra Kangralkar . Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *