stringtranslate.com

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

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

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

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

Макрос 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 ; утверждать ( указатель ); вернуть 0 ; }         

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

программа: source.c:5: main: Указатель утверждения не выполнен. Прервано (ядро сброшено)

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

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

static_assert

Макрос 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] В C23_Static_assert был переименован в , static_assertа аргумент строкового литерала стал необязательным. [11] [12] Gnulib определяет static_assertплатформы, которые не используют C11, и не требует включения Assert.h . [13]

Рекомендации

Цитаты

  1. ^ Биндер 2000, стр. 860.
  2. ^ Керниган и Ричи 1988, стр. 253-254.
  3. ^ ab 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. ^ ab 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. ^ "GNU Gnulib". Фонд свободного программного обеспечения . 6 февраля 2023 г. . Проверено 14 марта 2023 г.

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