11.3 Устаревшие возможности ¶
В CPP есть некоторые возможности, присутствующие в основном для совместимости со старыми программами. Мы не рекомендуем использовать их в новом коде. В некоторых случаях мы планируем удалить эту функцию в будущей версии GCC.
11.3.1 Утверждения ¶
Утверждения — это устаревшая альтернатива макросам при написании условных выражений для проверки того, на каком компьютере или системе будет выполняться скомпилированная программа. Утверждения обычно предварительно определены, но вы можете определить их с помощью директив препроцессора или параметров командной строки.
Утверждения предназначались для предоставления более систематического способа описания целевой системы компилятора, и мы добавили их для совместимости с существующими компиляторами. На практике они так же непредсказуемы, как и предварительно определённые системно-специфичные макросы. Кроме того, они не являются частью какого-либо стандарта, и лишь немногие компиляторы их поддерживают. Поэтому использование утверждений менее портативно, чем использование системно-специфичных предварительно определённых макросов. Мы рекомендуем вообще не использовать их.
Утверждение выглядит так:
#predicate (answer)
predicate должно быть одним идентификатором. answer может быть любой последовательностью токенов; все символы имеют значение, кроме ведущих и хвостовых пробелов, а различия в внутренних последовательностях пробелов игнорируются. (Это аналогично правилам переопределения макросов.) Таким образом, (x + y) отличается от (x+y), но эквивалентно ( x + y ). Скобки не вложены внутри ответа.
Для проверки утверждения вы записываете его в «#if». Например, это условное выражение выполняется успешно, если vax или ns16000 были утверждены как ответы для machine.
#if #machine (vax) || #machine (ns16000)
Вы можете проверить, утверждено ли любое значение для предиката, опуская ответ в условном выражении:
#if #machine
Утверждения выполняются с помощью директивы «#assert». Единственный её аргумент — утверждение, без ведущей «#», которая идентифицирует утверждения в условных выражениях.
#assert predicate (answer)
Вы можете выполнить несколько утверждений с одним предикатом и различными ответами. Последующие утверждения не переопределяют предыдущие для того же предиката. Все ответы для любого данного предиката одновременно истинны.
Утверждения можно отменить с помощью директивы «#unassert». Она имеет такой же синтаксис, как и «#assert». В этом формате она отменяет только ответ, который был указан в строке «#unassert»; другие ответы для этого предиката остаются истинными. Вы можете отменить весь предикат, опуская ответ:
#unassert predicate
В любом случае, если такое утверждение не было сделано, «#unassert» не оказывает никакого влияния.
Утверждения также можно задавать или отменять с помощью параметров командной строки. См. Вызов.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-11.4.0/cpp/Obsolete-Features.html