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
, добавленный в 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]
{{cite report}}
: CS1 maint: числовые имена: список авторов ( ссылка ){{cite report}}
: CS1 maint: числовые имена: список авторов ( ссылка )