WikiDer > Assert.h
Стандартная библиотека C |
---|
Общие темы |
Разные заголовки |
assert.h это заголовочный файл в стандартная библиотека из Язык программирования C что определяет Препроцессор C макрос утверждать()
.[1][2] В C ++ он также доступен через <cassert>
заголовочный файл.
Утверждать
assert (а! = 1);
Это макрос, который реализует среду выполнения утверждение, который можно использовать для проверки предположений, сделанных программой, и вывода диагностического сообщения, если это предположение неверно.
При выполнении, если выражение ложно (то есть сравнивается с 0), утверждать()
напишет информацию о вызове, который не удался stderr
а потом позвони прерывание ()
. Информация, которую он пишет stderr
включает:
- исходное имя файла (предопределенный макрос
__ФАЙЛ__
) - номер исходной строки (предопределенный макрос
__ЛИНИЯ__
) - исходная функция (предопределенный идентификатор
__func__
) (добавлено в C99) - текст выражения, которое оценивается как 0 [1]
Пример вывода программы, скомпилированной в Linux:
program: program.c: 5: main: Утверждение `a! = 1 'не выполнено. Отменить (дамп ядра)
Программисты могут исключить утверждения, просто перекомпилировав программу без изменения исходного кода: если макрос NDEBUG
определяется до включения <assert.h>
, то утверждать()
макрос может быть определен просто как:
#define assert (игнорировать) ((void) 0)
и поэтому не влияет на модуль компиляции, даже не оценивая его аргумент. Поэтому выражения передаются в утверждать()
должен нет содержать побочные эффекты поскольку они не будут происходить, когда отладка отключена. Например:
assert (x = получает ());
не будет читать строку и не присваивать x, когда отладка отключена.
Дополнительное сообщение
Хотя у Microsoft есть собственный макрос «assert with message», нет стандартизированного варианта утверждать()
это включает сообщение об ошибке. Тем не менее этого можно добиться, используя оператор запятой, который отбрасывает все предыдущие значения и сохраняет только последнее:
утверждать(("Пять пальцев!", 2 + 2 = 5));// или же#define assertmsg (x, msg) assert (((void) msg, x))assertmsg(2 + 2 == 5, "Пять пальцев!");
Получится что-то похожее на:
program: program.c: 5: main: Assertion `(" Пять пальцев! ", 2 + 2 == 5) 'не удалось.
Статическое утверждение
static_assert(размер(int) > 20, «Мне нужны огромные целые числа»);
C ++ 11 добавил похожее ключевое слово static_assert
[3] который контекстуально преобразует постоянное выражение в bool
и печатает сообщение (необязательно, начиная с C ++ 17[3]) во время компиляции, если оно ложно. Это можно смоделировать с помощью макроса и шаблонов, хотя, вероятно, в этом нет необходимости, поскольку большинство современных компиляторов C ++ поддерживают эту функцию C ++ 11.
Эта функция была официально добавлена в C11 как ключевое слово _Static_assert
с идентичным использованием, а в <assert.h>
удобный макрос static_assert
добавлен.
Можно смоделировать статическое утверждение в более старых версиях C с помощью макроса: #define static_assert (cond, str) char _temp [-! ((void) str, (cond))]
, хотя полученная ошибка является загадочной. (Это вызывает ошибку, потому что C допускает массивы нулевой длины, но не отрицательной длины.) ГнулибВерсия статического утверждения использует sizeof и структуру, чтобы вызвать аналогичную ошибку.[4]
Пример
#включают <stdio.h>#включают <assert.h>int test_assert(int Икс){ утверждать(Икс <= 4); возвращаться Икс;}int главный(){ int я; за (я=0; я<=9; я++) { test_assert(я); printf("я =% d", я); } возвращаться 0;}
i = 0i = 1i = 2i = 3i = 4assert: assert.c: 6: test_assert: утверждение `x <= 4 'не выполнено.
внешняя ссылка
- Единая спецификация UNIX, Выпуск 7 из Открытая группа : проверить утверждение программы - Справочник по базовым определениям,
Рекомендации
- ^ а б Международный стандарт языка программирования C (C99), ISO / IEC 9899: 1999, стр. 169
- ^ [Справочник программиста C / C ++, страница Coding]. Архивировано из оригинал на 2012-06-30. Получено 2012-03-23.
- ^ а б https://en.cppreference.com/w/cpp/language/static_assert
- ^ "gnulib / lib / verify.h". coreutils. 24 ноября 2019.