утверждения в нативном с ++ / отладка - PullRequest
0 голосов
/ 11 декабря 2011

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

char* append(char* pStr, const char* pAddStr)
{
    // Verify non-null pointers

    assert(pStr != nullptr);
    assert(pAddStr != nullptr);

    // Code to append pAddStr to pStr...
}

Вызов функции append () с аргументом нулевого указателя в простой программе вызвал следующее диагностическое сообщение на моем компьютере:

Assertion failed: pStr != nullptr, file c:\beginning visual c++ 2010\examples visual studio project files\tryassertion\tryassertion\tryassertion.cpp, line 10

Я хотел бы знать, необходимы ли утверждения. Какой смысл их использовать, если я могу использовать выражения if-else для вывода своих собственных сообщений об ошибках?

Ответы [ 3 ]

4 голосов
/ 11 декабря 2011

Утверждение является условной проверкой;это просто макрос, который выглядит примерно так (упрощенно):

#define assert(b) if (!(b)) { std::cerr << ...; exit(1); }

Я могу думать о двух преимуществах:

  1. Когда вы компилируете в режиме выпуска (то есть не в режиме отладки), тогда все assert скомпилируются в ничто, поэтому вы не будете подвергаться дополнительным затратам времени выполнения.
  2. assert - идиома;другие программисты знают, что их искать, и они также отличаются от «нормального» потока управления.
1 голос
/ 11 декабря 2011

Вы должны использовать утверждения, когда единственным случаем, в котором они нарушаются, является ошибка в логике программы.Вы используете обычные if - then - else условия для вещей, которые действительно могут произойти из-за ввода или возможных внешних условий (т. Е. Отсутствует файл).

Когда вы точно знаете, что программалогика неверна, на самом деле нет особого смысла пытаться продолжить выполнение ... ваша программа работает не так, как вы думаете (потому что в противном случае утверждение не сработало бы), и поэтому лучший вариант - просто кричать, в чем проблемаis и немедленно умирают.

Часто утверждения удаляются, когда код компилируется в режиме «релиза», даже если, тем не менее, может иметь смысл сохранять их на месте, если логика программы очень сложна и если продолжение выполнения приводит к неправильному выполнениювывод будет создавать большие проблемы, чем остановка выполнения.

Обратите внимание, что «ловушка», в которую иногда начинающие программисты попадают с утверждением, состоит в том, что когда код подтверждения удаляется для режима выпуска, выражение внутри утверждения не оценивается.больше, ипоэтому, если ваша программа зависит от побочных эффектов этого выражения, то у вас будут проблемы ... например:

...
assert(insert_record(db, data) == DB_OK);  // <== this is bad
...

, когда утверждение определено, вставка не произойдет вообще, оставляя васс программой, которая не работает в режиме выпуска и работает вместо этого, когда вы пытаетесь отладить проблему.

1 голос
/ 11 декабря 2011

утверждений используются для обеспечения выполнения определенных основных допущений. По сути, вы помещаете в каждом случае утверждение, которое «не может произойти», чаще всего утверждается, как должен использоваться API, например, предварительные условия и постусловия (как ваш пример, который содержит утверждения, которые проверяют правильное использование вашей функции добавления). Для других ошибок, которые, как известно, возникают во время выполнения и которые не могут быть предотвращены заранее (например, ошибки типа «файл не найден» или «недостаточно прав»), вам придется написать код обработки ошибок.

Утверждения не включены в компиляции релизов, поэтому они могут использоваться только для обнаружения критических ошибок программирования, которые уже будут возникать при тестовых запусках в режиме отладки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...