Argumentos de longitud variable para Macros

Al igual que las funciones, también podemos pasar argumentos de longitud variable a las macros. Para ello utilizaremos los siguientes identificadores de preprocesador.
Para admitir argumentos de longitud variable en macro, debemos incluir puntos suspensivos (…) en la definición de macro. También hay un identificador de preprocesamiento «__VA_ARGS__» que se ocupa de las sustituciones de argumentos de longitud variable que se proporcionan a la macro. El operador de concatenación ## (también conocido como operador de pegado) se usa para concatenar argumentos variables. 
Veamos con ejemplo. La siguiente macro toma un argumento de longitud variable como la función «printf()». Esta macro es para el registro de errores. La macro imprime el nombre del archivo seguido del número de línea y, finalmente, imprime el mensaje de información/error. Los primeros argumentos «prio» determinan la prioridad del mensaje, es decir, si se trata de un mensaje de información o de error, «flujo» puede ser «salida estándar» o «error estándar». Muestra mensajes INFO en stdout y mensajes de ERROR en stderr stream. 
 

C

#include <stdio.h>
 
#define INFO     1
#define ERR    2
#define STD_OUT    stdout
#define STD_ERR    stderr
 
#define LOG_MESSAGE(prio, stream, msg, ...) do {\
                        char *str;\
                        if (prio == INFO)\
                            str = "INFO";\
                        else if (prio == ERR)\
                            str = "ERR";\
                        fprintf(stream, "[%s] : %s : %d : "msg" \n", \
                                str, __FILE__, __LINE__, ##__VA_ARGS__);\
                    } while (0)
 
int main(void)
{
    char *s = "Hello";
 
        /* display normal message */
    LOG_MESSAGE(ERR, STD_ERR, "Failed to open file");
 
    /* provide string as argument */
    LOG_MESSAGE(INFO, STD_OUT, "%s Geeks for Geeks", s);
 
    /* provide integer as arguments */
    LOG_MESSAGE(INFO, STD_OUT, "%d + %d = %d", 10, 20, (10 + 20));
 
    return 0;
}

Compile y ejecute el programa anterior, produce el siguiente resultado. 
 

  [narendra@/media/partition/GFG]$ ./variable_length 
  [ERR] : variable_length.c : 26 : Failed to open file 
  [INFO] : variable_length.c : 27 : Hello Geeks for Geeks 
  [INFO] : variable_length.c : 28 : 10 + 20 = 30 
  [narendra@/media/partition/GFG]$

Este artículo fue compilado por Shreyan Biswas. 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 *