Я всегда думал, что assert — это просто функция сообщения об ошибках, но на самом деле это макрос, и его назначение не «сообщение об ошибках».

После некоторого понимания я обнаружил, что использование assert() напоминает своего рода «контрактное программирование». В моём понимании это означает, что программа может нормально и хорошо работать при моих предположениях. Фактически это эквивалентно оператору if:

if(假设成立)
{
     程序正常运行;
}
else
{
      报错&&终止程序!(避免由程序运行引起更大的错误)  
}

Но если писать так, получится бесчисленное множество операторов if, и может даже случиться, что скобки одного оператора if растянутся от начала до конца файла. Более того, в большинстве случаев предположения, которые нам нужно проверить, — это лишь случайные события, или мы просто хотим проверить, возникают ли некоторые наихудшие сценарии. Вот почему существует assert().

Прототип макроса assert определён в assert.h. Его функция — завершить выполнение программы, если его условие возвращает ошибку.

#include "assert.h" 
void assert( int expression );

Роль assert состоит в том, чтобы сначала вычислить выражение expression; если его значение ложно (то есть 0), он сначала выводит сообщение об ошибке в stderr, а затем завершает выполнение программы, вызывая abort.

Недостаток использования assert в том, что частые вызовы могут сильно влиять на производительность программы и добавлять дополнительные накладные расходы.

После отладки можно отключить вызовы assert, вставив #define NDEBUG перед директивой #include. Пример кода выглядит так:

#include 
#define NDEBUG 
#include

Итоги использования и меры предосторожности

1) Проверяйте корректность входных параметров в начале функции.

Например:

int resetBufferSize(int nNewSize) 
{ 
//功能:改变缓冲区大小, 
//参数:nNewSize 缓冲区新长度 
//返回值:缓冲区当前长度 
//说明:保持原信息内容不变 nNewSize<=0表示清除缓冲区 
assert(nNewSize >= 0); 
assert(nNewSize <= MAX_BUFFER_SIZE); 
 
... 
}

2) Каждый assert должен проверять только одно условие, потому что при одновременной проверке нескольких условий, если утверждение не выполняется, невозможно интуитивно определить, какое условие не выполнилось.

     

Плохо:

assert(nOffset>=0 && nOffset+nSize<=m_nInfomationSize); 
    

Хорошо:

assert(nOffset >= 0); 
assert(nOffset+nSize <= m_nInfomationSize); 

3) Не используйте операторы, изменяющие окружение, потому что assert действует только в DEBUG. Если вы так сделаете, это вызовет проблемы при реальном выполнении программы.

Неправильно: assert(i++ < 100)

Это потому, что если произойдёт ошибка, например, если перед выполнением i=100, то этот оператор не будет выполнен, поэтому команда i++ не выполнится.

Верно:

assert(i < 100)
i++; 

4) Между assert и следующим оператором должна быть пустая строка, чтобы сформировать логическую и визуальную согласованность.

  

5) В некоторых местах assert не может заменить условную фильтрацию.

  

Программы обычно делятся на Debug-версии и Release-версии. Debug-версии используются для внутренней отладки, а Release-версии распространяются среди пользователей. Утверждение assert — это макрос, который работает только в Debug-версиях; оно используется для проверки ситуаций, которые "не должны" происходить. Ниже приведена программа копирования памяти. Во время выполнения, если параметр assert ложен, программа завершится (обычно появляется диалоговое окно с подсказкой, указывающее, где сработал assert).

Ниже приведены несколько принципов использования утверждений:

  • (1) Используйте утверждения для отлова недопустимых ситуаций, которые не должны происходить. Не путайте разницу между недопустимыми ситуациями и ошибочными ситуациями; последние обязательно существуют, и их необходимо обрабатывать.
  • (2) Используйте утверждения для подтверждения параметров функций.
  • (3) При написании функций многократно проверяйте и спрашивайте себя: "Какие предположения я намереваюсь сделать?" Как только предположение определено, используйте утверждения для его проверки.
  • (4) Обычные учебники поощряют программистов применять защитное программирование, но помните, что этот стиль программирования может скрывать ошибки. При защитном программировании, если что-то, что "не может произойти", всё же происходит, используйте утверждения, чтобы подать сигнал тревоги.

ASSERT() — это макрос, часто используемый при отладке программ. Во время выполнения он вычисляет выражение внутри круглых скобок. Если выражение равно FALSE (0), программа сообщит об ошибке и завершит выполнение. Если выражение не равно 0, она продолжает выполнять последующие операторы. Этот макрос обычно используется для определения, появились ли в программе явно недопустимые данные; если да, он завершает программу, чтобы избежать серьёзных последствий, а также облегчает поиск ошибок.

ASSERT действителен только в Debug-версиях; он игнорируется, если скомпилировано как Release-версия.

Исходный URL: https://www.cnblogs.com/thisway/p/5558914.html