Jump to content

утверждать.h

Assert.h это заголовочный файл стандартной библиотеки C. — Он определяет препроцессора C. макрос assert и реализует утверждение времени выполнения в C.

Assert.h определен в ANSI C как часть стандартной библиотеки C. На языке программирования C++ — Assert.h и <cassert> доступны; оба функционально эквивалентны. [1]

Использовать

[ редактировать ]

The assert макрос реализует утверждение во время выполнения. Если выражение внутри него ложно, макрос напечатает сообщение stderr и позвони abort(), определенный в stdlib.h . Сообщение включает имя исходного файла и номер исходной строки из макроса. __FILE__ и __LINE__, соответственно. [2] Начиная с C99 , имя функции, в операторе утверждения включено как ( __FUNC__) и само выражение. [3] В ANSI C выражение в assert макрос определяется как целое число со знаком , хотя можно использовать любое выражение, которое можно неявно привести к целому числу со знаком. В C99 assert макрос явно допускает любой скалярный тип. [4] Два распространенных варианта использования assert Макрос должен утверждать, что указатель не равен нулю, и гарантировать, что индекс массива находится в пределах границ. [5]

Ниже представлена ​​программа, использующая assert макрос. Эта программа всегда будет оценивать pointer как ложь, как pointer является нулевым указателем и не указывает на допустимую ячейку памяти :

#include <assert.h>
int main()
{
    void* pointer = 0;
    assert(pointer);
    return 0;
}

После компиляции программы и ее запуска будет выведено сообщение, подобное следующему:

program: source.c:5: main: Assertion 'pointer' failed.
Aborted (core dumped)

Определение assert макрос меняется в зависимости от определения другого макроса, NDEBUG. Если NDEBUG определяется как имя макроса, assert макрос определяется как #define assert(ignore) ((void)0), [3] в результате макрос не оценивает выражение. Использование NDEBUG может повлиять на общее поведение программы, если один или несколько assert операторы содержат побочные эффекты , поскольку эти операторы не оцениваются. [6]

The assert макрос не содержит сообщения об ошибке . Однако оператор запятая , как в для добавления его к печатному выражению можно использовать assert(("Not Orwellian", 2 + 2 == 5));. [7]

The static_assert макрос, добавленный в C++11 , служит той же цели, что и макрос assert макрос. В отличие от assert макрос, static_assert запускается во время компиляции, а не во время выполнения. [8] В исходной реализации использовались хаки шаблонов. [ нужна ссылка ] static_assert макрос принимает постоянное выражение, которое можно преобразовать в логическое значение и строковый литерал; если выражение завершается неудачно, возвращается строковый литерал, в противном случае макрос не оказывает никакого эффекта. [8] В C++17 это сообщение об ошибке утверждения стало необязательным, а последующее сообщение опускается, если не указано. [9]

В C11 функционально эквивалентное объявление _Static_assert был добавлен. Assert.h определяет static_assert как псевдоним для _Static_assert для обеспечения паритета с C++ . [10] В С23 , _Static_assert был переименован в static_assert и аргумент строкового литерала стал необязательным. [11] [12] Gnulib определяет static_assert для платформ, которые не используют C11 и не требуют Assert.h должен быть включен. [13]

  1. ^ Биндер 2000 , с. 860.
  2. ^ Керниган и Ричи 1988 , с. 253-254.
  3. ^ Перейти обратно: а б ISO/IEC JTC 1/SC 22/WG14 1999 г. , стр. 169.
  4. ^ «Руководство программиста Linux» . 25 августа 2002 года . Проверено 14 марта 2023 г.
  5. ^ Рики, Джон (7 декабря 1995 г.). «Как использовать утверждения в C» . Калифорнийский университет в Беркли . Проверено 14 марта 2023 г.
  6. ^ Американский национальный институт стандартов, 1990 , стр. 76.
  7. ^ Грегуар 2021 , с. 1058.
  8. ^ Перейти обратно: а б ISO/IEC JTC 1/SC 22/WG21 2012 , стр. 134.
  9. ^ Сваминатан 2017 , с. 13.
  10. ^ Обсуждение 2013 , стр. 762-763.
  11. ^ Густедт 2022 , с. 3.
  12. ^ Ballman & Grammatech 2018 , с. 1.
  13. ^ «ГНУ Гнулиб» . Фонд свободного программного обеспечения . 6 февраля 2023 г. . Проверено 14 марта 2023 г.

Библиография

[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: b04cb992e51bb074c1e726067a09d10b__1686336660
URL1:https://arc.ask3.ru/arc/aa/b0/0b/b04cb992e51bb074c1e726067a09d10b.html
Заголовок, (Title) документа по адресу, URL1:
assert.h - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)