Spec-Zone.ru › GCC 10 CPP

Следующая: Директивы внутри аргументов макроса, Предыдущая: Предопределённые макросы, Наверх: Макросы [Оглавление][Индекс]

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-10.5.0/cpp/Undefining-and-Redefining-Macros.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API