Рубрики

Гигиенические Макросы: Введение

Мы все знакомы с работой макросов в таких языках, как C. Существуют определенные ситуации, в которых расширения макросов могут привести к нежелательным результатам из-за случайного захвата идентификаторов.
Например:

// C программа для иллюстрации ситуации, известной как
// случайный захват идентификаторов -
// нежелательный результат, вызванный негигиеничными макросами
#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\n", x, y);

    return 0;

}

Код фактически эквивалентен:

// C программа для иллюстрации негигенных макросов
// с определением макроса в исходном коде.

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\n", x, y);

    return 0;

}

Выход:

x = 4, y = 9

Переменная a, объявленная в области действия основной функции, затеняется переменной a в определении макроса, поэтому a = 4 никогда не обновляется (так называемый случайный захват).

Гигиенические макросы

Гигиенические макросы — это макросы, расширение которых гарантированно не вызовет случайного захвата идентификаторов. Гигиенический макрос не использует имена переменных, которые могут помешать расширению кода.
Ситуации в приведенном выше коде можно избежать, просто изменив имя переменной в определении макроса, что приведет к другому выводу.

// C программа для иллюстрации
// Гигиенические макросы с использованием
// имена идентификаторов такие, что
// они не вызывают
// случайный захват идентификаторов
#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\n", x, y);

    return 0;

}

Выход:

x = 5, y = 9

Эта статья предоставлена Palash Nigam . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Гигиенические Макросы: Введение

0.00 (0%) 0 votes