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