3.8 Отмена и переопределение макросов
Если макрос больше не нужен, его можно отменить с помощью директивы ‘#undef’. Директива ‘#undef’ принимает один аргумент — имя макроса для отмены. Используйте имя макроса без параметров, даже если макрос является функцией. Любой текст после имени макроса является ошибкой. Директива ‘#undef’ не имеет эффекта, если имя не является макросом.
#define FOO 4 x = FOO; → x = 4; #undef FOO x = FOO; → x = FOO;
После отмены макроса идентификатор может быть переопределён как макрос с помощью последующей директивы ‘#define’. Новое определение может не иметь никакого сходства со старым.
Однако, если идентификатор, который в данный момент является макросом, переопределяется, то новое определение должно быть эффективно таким же, как и старое. Два определения макроса считаются эффективно одинаковыми, если:
- Оба являются макросами одного типа (объектного или функционального).
- Все токены списка замены одинаковы.
- Если есть параметры, они одинаковы.
- Пробелы расположены в одних и тех же местах в обоих определениях. Количество пробелов не должно быть точно одинаковым. Имейте в виду, что комментарии учитываются как пробелы.
Эти определения эффективно одинаковы:
#define FOUR (2 + 2)
#define FOUR (2 + 2)
#define FOUR (2 /* two */ + 2)
но эти — нет:
#define FOUR (2 + 2) #define FOUR ( 2+2 ) #define FOUR (2 * 2) #define FOUR(score,and,seven,years,ago) (2 + 2)
Если макрос переопределяется с определением, которое не является эффективно таким же, как и старое, препроцессор выведет предупреждение и изменит макрос, чтобы использовать новое определение. Если новое определение эффективно такое же, то переопределение будет проигнорировано. Это позволяет, например, двум разным заголовкам определить один общий макрос. Препроцессор будет жаловаться только если определения не совпадают.
Далее: Директивы внутри аргументов макроса, Предыдущее: Предопределённые макросы, Вверх: Макросы [Содержание][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-12.1.0/cpp/Undefining-and-Redefining-Macros.html