Spec-Zone.ru › GCC 12 CPP

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

Spec-Zone.ru

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