утверждать.h
Стандартная библиотека C (libc) |
---|
Общие темы |
Разные заголовки |
|
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]
static_assert
[ редактировать ]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]
Ссылки
[ редактировать ]Цитаты
[ редактировать ]- ^ Биндер 2000 , с. 860.
- ^ Керниган и Ричи 1988 , с. 253-254.
- ^ Перейти обратно: а б ISO/IEC JTC 1/SC 22/WG14 1999 г. , стр. 169.
- ^ «Руководство программиста Linux» . 25 августа 2002 года . Проверено 14 марта 2023 г.
- ^ Рики, Джон (7 декабря 1995 г.). «Как использовать утверждения в C» . Калифорнийский университет в Беркли . Проверено 14 марта 2023 г.
- ^ Американский национальный институт стандартов, 1990 , стр. 76.
- ^ Грегуар 2021 , с. 1058.
- ^ Перейти обратно: а б ISO/IEC JTC 1/SC 22/WG21 2012 , стр. 134.
- ^ Сваминатан 2017 , с. 13.
- ^ Обсуждение 2013 , стр. 762-763.
- ^ Густедт 2022 , с. 3.
- ^ Ballman & Grammatech 2018 , с. 1.
- ^ «ГНУ Гнулиб» . Фонд свободного программного обеспечения . 6 февраля 2023 г. . Проверено 14 марта 2023 г.
Библиография
[ редактировать ]- Американский национальный институт стандартов (1990). Обоснование языка программирования ANSI C. Саммит: Silicon Press. ISBN 9780929306070 .
- Боллман, Аарон; Грамматех (6 июля 2018 г.). Гармонизация static_assert с C++ (Отчет).
- Биндер, Роберт (2000). Тестирование объектно-ориентированных систем: модели, шаблоны и инструменты (2-е изд.). Бостон: Аддисон-Уэсли . ISBN 9780201809381 .
- Грегуар, Марк (2021). Профессиональный C++ (5-е изд.). Хобокен: Уайли . ISBN 9781119695455 .
- Гуштедт, Йенс (15 февраля 2022 г.). Исправьте написание ключевых слов (Отчет).
- Керниган, Брайан ; Ричи, Деннис (1988). Язык программирования C (2-е изд.). Хобокен: Прентис Холл. ISBN 9780131103627 .
- Лишнер, Рэй (2009). Вкратце о C++: Краткий справочник по рабочему столу (2-е изд.). Севастополь: О'Рейли Медиа . ISBN 9781449378837 .
- ISO/IEC JTC 1/SC 22/WG14 (декабрь 1999 г.). ISO/IEC 9899:1999 (Отчет).
{{cite report}}
: CS1 maint: числовые имена: список авторов ( ссылка ) - ISO/IEC JTC 1/SC 22/WG21 (январь 2012 г.). ISO/IEC 14882:2011 (Отчет).
{{cite report}}
: CS1 maint: числовые имена: список авторов ( ссылка ) - Прата, Стивен (2013). C Primer Plus (6-е изд.). Лондон: Pearson Education . ISBN 9780133432381 .
- Сваминатан, Джганатан (2017). Освоение программирования на C++ . Бирмингем: Пакет . ISBN 9781786461629 .