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-4.9.4/cpp/Obsolete-Features.html