Какие утверждения? и зачем ты их используешь?

StackOverflow https://stackoverflow.com/questions/253212

  •  05-07-2019
  •  | 
  •  

Вопрос

Как делаются утверждения в 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 до вызова.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top