Я изучал руководства по OpenCV и наткнулся на эту assert
функцию; Что это делает?
Я изучал руководства по OpenCV и наткнулся на эту assert
функцию; Что это делает?
Ответы:
assert
завершит программу (обычно с сообщением, цитирующим оператор assert), если его аргумент окажется ложным. Он обычно используется во время отладки, чтобы сделать программу более очевидной, если возникает непредвиденное состояние.
Например:
assert(length >= 0); // die if length is negative.
Вы также можете добавить более информативное сообщение, которое будет отображаться в случае сбоя, например:
assert(length >= 0 && "Whoops, length can't possibly be negative! (didn't we just check 10 lines ago?) Tell jsmith");
Или еще так:
assert(("Length can't possibly be negative! Tell jsmith", length >= 0));
Когда вы делаете релизную (не отладочную) сборку, вы также можете устранить накладные расходы при оценке assert
операторов, определив NDEBUG
макрос, обычно с помощью переключателя компилятора. Следствием этого является то, что ваша программа никогда не должна полагаться на запущенный макрос assert.
// BAD
assert(x++);
// GOOD
assert(x);
x++;
// Watch out! Depends on the function:
assert(foo());
// Here's a safer way:
int ret = foo();
assert(ret);
Исходя из комбинации программы, вызывающей abort () и не гарантирующей что-либо делать, утверждения следует использовать только для проверки того, что разработчик предположил, а не, например, для ввода пользователем числа, а не буквы (что должно быть обрабатывается другими средствами).
assert
обычно вызывает исключение» - в C ++ оно не вызывает «исключение», которое вызывает abort ... оно немного отличается.
#
символ не вводит комментарий.
assert("error message", expression)
Утверждают , компьютер утверждение аналогично высказыванию убедитесь , что на английском языке.
Взгляни на
Пример программы assert () на C ++
Многие компиляторы предлагают макрос assert (). Макрос assert () возвращает TRUE, если его параметр оценивает TRUE, и предпринимает какие-то действия, если он оценивает FALSE. Многие компиляторы прерывают программу при сбое assert (); другие бросят исключение
Одна из мощных особенностей макроса assert () состоит в том, что препроцессор вообще не сворачивает его в код, если DEBUG не определен. Это отличная помощь во время разработки, и когда конечный продукт поставляется, нет снижения производительности и увеличения размера исполняемой версии программы.
Например
#include <stdio.h>
#include <assert.h>
void analyze (char *, int);
int main(void)
{
char *string = "ABC";
int length = 3;
analyze(string, length);
printf("The string %s is not null or empty, "
"and has length %d \n", string, length);
}
void analyze(char *string, int length)
{
assert(string != NULL); /* cannot be NULL */
assert(*string != '\0'); /* cannot be empty */
assert(length > 0); /* must be positive */
}
/**************** Output should be similar to ******************
The string ABC is not null or empty, and has length 3
Функция assert () может диагностировать программные ошибки. В C он определен в <assert.h>
, а в C ++ - в <cassert>
. Его прототип
void assert(int expression);
Выражением аргумента может быть все, что вы хотите проверить - переменная или любое выражение C. Если выражение имеет значение TRUE, assert () ничего не делает. Если выражение имеет значение FALSE, assert () отображает сообщение об ошибке в stderr и прерывает выполнение программы.
Как вы используете assert ()? Чаще всего он используется для отслеживания программных ошибок (которые отличаются от ошибок компиляции). Ошибка не препятствует компиляции программы, но приводит к тому, что она дает неверные результаты или работает неправильно (например, блокировка). Например, программа финансового анализа, которую вы пишете, может иногда давать неправильные ответы. Вы подозреваете, что проблема вызвана тем, что переменная Interest_rate принимает отрицательное значение, которое никогда не должно происходить. Чтобы проверить это, поместите заявление
assert (Interest_rate> = 0); в местах в программе, где используется Interest_rate. Если переменная становится отрицательной, макрос assert () предупреждает вас. Затем вы можете изучить соответствующий код, чтобы найти причину проблемы.
Чтобы увидеть, как работает assert (), запустите пример программы ниже . Если вы введете ненулевое значение, программа отобразит это значение и завершится нормально. Если вы введете ноль, макрос assert () вызывает аварийное завершение программы. Точное сообщение об ошибке будет зависеть от вашего компилятора, но вот типичный пример:
Ошибка подтверждения: x, файл list19_3.c, строка 13 Обратите внимание, что для работы assert () ваша программа должна быть скомпилирована в режиме отладки. Обратитесь к документации вашего компилятора для получения информации о включении режима отладки (как объяснено ниже). При последующей компиляции окончательной версии в режиме выпуска макросы assert () отключаются.
int x;
printf("\nEnter an integer value: ");
scanf("%d", &x);
assert(x >= 0);
printf("You entered %d.\n", x);
return(0);
Введите целое значение: 10
Вы ввели 10.
Введите целое значение: -1
Сообщение об ошибке: аварийное завершение программы
Ваше сообщение об ошибке может отличаться в зависимости от вашей системы и компилятора, но общая идея та же.
Такие вещи, как «вызывает исключение» и «прекращение выполнения» могут быть верными для большинства компиляторов, но не для всех. (Кстати, существуют ли утверждения assert, которые действительно генерируют исключения?)
Вот интересное, немного другое значение assert, используемое c6x и другими компиляторами TI: увидев определенные операторы assert, эти компиляторы используют информацию в этом операторе для выполнения определенных оптимизаций. Злой.
Пример в C:
int dot_product(short *x, short *y, short z)
{
int sum = 0
int i;
assert( ( (int)(x) & 0x3 ) == 0 );
assert( ( (int)(y) & 0x3 ) == 0 );
for( i = 0 ; i < z ; ++i )
sum += x[ i ] * y[ i ];
return sum;
}
Это говорит де-компилятору, что массивы выровнены по 32-битным границам, поэтому компилятор может генерировать конкретные инструкции, сделанные для такого типа выравнивания.
C ++ 11 N3337 стандартная версия
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf
19.3 Утверждения
1 Заголовок <cassert>, описанный в (Таблица 42), предоставляет макрос для документирования утверждений программы C ++ и механизм для отключения проверок утверждений.
2 Содержимое совпадает с заголовком стандартной библиотеки C <assert.h>.
C99 N1256 стандартная тяга
http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf
7.2 Диагностика <assert.h>
1 Заголовок
<assert.h>
определяет макрос assert и ссылается на другой макрос,NDEBUG
который не определен<assert.h>
. ЕслиNDEBUG
определяется как имя макроса в той точке исходного файла, в которую включен <assert.h>, макрос assert определяется просто как#define assert(ignore) ((void)0)
Макрос assert переопределяется в соответствии с текущим состоянием NDEBUG при каждом
<assert.h>
включении.2. Макрос утверждения должен быть реализован как макрос, а не как фактическая функция. Если определение макроса подавлено для доступа к реальной функции, поведение не определено.
7.2.1 Программа диагностики
7.2.1.1 Макрос утверждения
конспект
1.
#include <assert.h> void assert(scalar expression);
Описание
2 Макрос assert помещает диагностические тесты в программы; оно расширяется до пустого выражения. Когда оно выполняется, если выражение (которое должно иметь скалярный тип) имеет значение false (то есть сравнивает значение, равное 0), макрос assert записывает информацию о конкретном вызове, который не удался (включая текст аргумента, имя исходный файл, номер исходной строки и имя включающей функции - последние являются соответственно значениями макросов предварительной обработки
__FILE__
и__LINE__
и идентификатора__func__
) в стандартном потоке ошибок в формате, определяемом реализацией. 165) Затем вызывается функция прерывания.Возвращает
3 Макрос assert не возвращает значения.
Существует три основных причины использования функции assert () по сравнению с обычными if else и printf
Функция assert () в основном используется на этапе отладки, и утомительно писать, если еще с оператором printf, каждый раз, когда вы хотите проверить условие, которое может даже не попасть в окончательный код.
В больших развертываниях программного обеспечения assert очень удобен, когда вы можете заставить компилятор игнорировать операторы assert, используя макрос NDEBUG, определенный перед связыванием файла заголовка для функции assert ().
assert () пригодится, когда вы разрабатываете функцию или некоторый код и хотите получить представление о том, какие ограничения будет и не будет работать с кодом, и, наконец, включить if else для его оценки, в основном играя с предположениями.
Это функция, которая останавливает выполнение программы, если оцененное значение равно false. Обычно он окружен макросом, так что он не компилируется в результирующий двоичный файл при компиляции с настройками выпуска.
Он предназначен для проверки сделанных вами предположений. Например:
void strcpy(char* dest, char* src){
//pointers shouldn't be null
assert(dest!=null);
assert(src!=null);
//copy string
while(*dest++ = *src++);
}
В идеале вы хотите, чтобы вы могли сделать ошибку в вашей программе, например, вызвать функцию с недопустимыми аргументами, и вы нажали assert до того, как он вышел из строя (или не работает должным образом)
Кроме того, вы можете использовать его для проверки успешности динамического размещения.
Пример кода:
int ** p;
p = new int * [5]; // Dynamic array (size 5) of pointers to int
for (int i = 0; i < 5; ++i) {
p[i] = new int[3]; // Each i(ptr) is now pointing to a dynamic
// array (size 3) of actual int values
}
assert (p); // Check the dynamic allocation.
Похожий на:
if (p == NULL) {
cout << "dynamic allocation failed" << endl;
exit(1);
}
new
Выдает исключение при ошибке выделения, если вы не укажете nothrow
(чего вы здесь не сделали). Кроме того, ваше форматирование странное и exit
злое.
assert()
предназначен только для отладки и удаления вещей, которые никогда не должны происходить никогда - задолго до того, как будет выпущена сборка релиза.