Todos estamos familiarizados con el funcionamiento de macros en lenguajes como C. Hay ciertas situaciones en las que las expansiones de macros pueden dar lugar a resultados no deseados debido a la captura accidental de identificadores.
Por ejemplo:

#define INCI(i) do { int x = 0; ++i; } while(0)

int main(void)

{

    int x = 4, y = 8;

     

    

    INCI(x);

     

    

    INCI(y);

     

    printf("x = %d, b = %d
"
, x, y);

    return 0;

}

El código es realmente equivalente a:

int main(void)

{

    int x = 4, y = 8;

     

    

    do { int x = 0; ++x; } while(0);

     

    

    do { int x = 0; ++y; } while(0);

     

    printf("x = %d, b = %d
"
, x, y);

    return 0;

}

Producción:

x = 4, y = 9

La variable a declarada en el alcance de la función principal está eclipsada por la variable a en la definición de macro, por lo que a = 4 nunca se actualiza (conocido como captura accidental).

Macros higiénicas

br>

Las macros higiénicas son macros cuya expansión está garantizada para no provocar la captura accidental de identificadores. Una macro higiénica no usa nombres de variables que puedan interferir con el código en expansión.
La situación en el código anterior se puede evitar simplemente cambiando el nombre de la variable en la definición de macro, lo que producirá una salida diferente.

#define INCI(i) do { int m = 0; ++i; } while(0)

int main(void)

{

    int x = 4, y = 8;

     

    

    INCI(x);

     

    

    INCI(y);

     

    printf("x = %d, y = %d
"
, x, y);

    return 0;

}

Producción:

x = 5, y = 9

Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema discutido anteriormente.

Deja una respuesta

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