Какие утверждения? и зачем ты их используешь?
Вопрос
Как делаются утверждения в c ++? Пример кода приветствуется.
Решение
Утверждения - это способ явной проверки допущений, которые делает ваш код, который помогает вам отследить множество ошибок, сузив возможные проблемы. Как правило, они оцениваются только в специальном «debug» сборка приложения, чтобы они не замедляли работу финальной версии.
Допустим, вы написали функцию, которая взяла указатель в качестве аргумента. Есть большая вероятность, что ваш код будет предполагать, что указатель не равен NULL, так почему бы не проверить это явно с помощью утверждения? Вот как:
#include <assert.h>
void function(int* pointer_arg)
{
assert(pointer_arg != NULL);
...
}
Важно отметить, что утвержденные вами выражения никогда не должны иметь побочных эффектов, поскольку они не будут присутствовать в сборке выпуска. Поэтому никогда не делайте что-то подобное:
assert(a++ == 5);
Некоторым людям также нравится добавлять небольшие сообщения в свои утверждения, чтобы помочь им придать смысл. Поскольку строка всегда имеет значение true, вы можете написать это так:
assert((a == 5) && "a has the wrong value!!");
Другие советы
Утверждение - это логическое выражение, которое обычно всегда должно быть истинным.
Они используются для обеспечения того, что вы ожидаете, и того, что происходит.
void some_function(int age)
{
assert(age > 0);
}
Вы написали функцию для работы с возрастами, вы также «точно знаете», что всегда передаете разумные аргументы, тогда вы используете assert. Это все равно, что сказать: «Я знаю, что это никогда не может пойти не так, как надо, но если это так, я хочу знать», потому что, в общем, все делают ошибки.
Так что не стоит проверять разумный пользовательский ввод, если есть сценарий, где что-то может пойти не так, не используйте assert. Проводите реальные проверки и устраняйте ошибки.
Утверждения обычно предназначены только для отладочных сборок, поэтому не помещайте код с побочными эффектами в утверждения. Р>
Утверждения используются для проверки проектных предположений, обычно в терминах входных параметров и возвращаемых результатов. Например,
// Given customer and product details for a sale, generate an invoice
Invoice ProcessOrder(Customer Cust,Product Prod)
{
assert(IsValid(Cust));
assert(IsValid(Prod);
'
'
'
assert(IsValid(RetInvoice))
return(RetInvoice);
}
Операторы assert не требуются для выполнения кода, но они проверяют правильность ввода и вывода. Если ввод неверен, в вызывающей функции есть ошибка. Если ввод действителен, а вывод недействителен, в этом коде есть ошибка. См. дизайн по контракту для получения более подробной информации об этом использовании утверждений.
Редактировать. Как указывалось в других публикациях, реализация assert по умолчанию не включена во время выполнения релиза. Обычная практика, которую используют многие, в том числе и я, - это заменить ее версией, включенной в сборку релиза, но вызываемой только в режиме диагностики. Это позволяет проводить надлежащее регрессионное тестирование в сборках релизов с полной проверкой утверждений. Моя версия выглядит следующим образом;
extern void _my_assert(void *, void *, unsigned);
#define myassert(exp) \
{ \
if (InDiagnostics) \
if ( !(exp) ) \
_my_assert(#exp, __FILE__, __LINE__); \
} \
В этой технике есть небольшие накладные расходы времени выполнения, но она значительно облегчает отслеживание любых ошибок, которые привели к появлению в поле.
Используйте утверждения, чтобы проверить, что " не может произойти " ситуации.
Типичное использование: проверка недействительных / невозможных аргументов в верхней части функции.
Редко встречается, но все же полезно: инварианты цикла и постусловия.
Утверждения - это утверждения, позволяющие вам проверить любые предположения, которые могут возникнуть в вашей программе. Это особенно полезно для документирования логики вашей программы (предусловия и постусловия). Неудачные утверждения обычно выдают ошибки во время выполнения и являются признаками того, что что-то ОЧЕНЬ неправильно с вашей программой - ваше утверждение не удалось, потому что что-то, что вы предположили как истинное, не было. Обычные причины: в логике вашей функции есть ошибка, или вызывающая сторона вашей функции передала вам неверные данные.
Утверждение - это то, что вы добавляете в свою программу, что приводит к немедленной остановке программы при выполнении условия и отображению сообщения об ошибке. Вы обычно используете их для вещей, которые, по вашему мнению, никогда не произойдут в вашем коде. Р>
Это не относится к средству assert , которое дошло до нас с ранних дней C, но вам также следует знать о Boost StaticAssert , если ваши проекты могут использовать Boost.
Стандартное утверждение C / C ++ работает во время выполнения. Функция Boost StaticAssert позволяет вам делать некоторые классы утверждений во время компиляции, перехватывая логические ошибки и тому подобное еще раньше.
Вот определение того, что такое утверждение, и здесь - некоторый пример кода. В двух словах, утверждение - это способ для разработчика проверить свои предположения о состоянии кода в любой заданной точке. Например, если вы делали следующий код:
mypointer->myfunct();
Вы, вероятно, хотите утверждать, что mypointer не равен NULL, потому что это ваше предположение - что mypointer никогда не будет NULL до вызова. Р>