Код завален утверждениями

0

Привет, я программирую на каком-то устройстве. Существует пример с таким кодом:

Verify(SomeFunc(argc, argv) == SDK_OK);

Verify(SomeOtherFunction(&st_initialData) == SDK_OK);

Verify(SomeOtherFunction2(x,y) == SDK_OK);

В doc Verify определяется как "аналогичный" для утверждения.

Мой вопрос: если я создам свой проект в режиме Release, что произойдет с вышеприведенными утверждениями? Потеряют ли они свою власть? Будет ли Verify иметь эффект?

Чтобы избежать возможных проблем с выше, мне придется заменить выше коды с проверкой возвращаемых значений следующим образом?:

if(SomeFunc(argc, argv) == SDK_OK)
{
// we are fine
}
else
{
// handle error somehow, such that it is also available in Release mode
}
Теги:

3 ответа

1

Невозможно сказать, так как кажется, что именно ваш проект реализует Verify, как макрос или как функцию. Почему бы вам не взглянуть на реализацию?

При этом в MFC-инфраструктуре есть макрос VERIFY, аналогичный ASSERT, с тем отличием, что выражение всегда оценивается даже в сборке релиза, но ничего не делает, если результат выражения ложный. Это может быть аналогичный подход, так как ваши примеры, похоже, вызывают некоторые функции, которые могут повлиять на состояние системы.

  • 0
    Если MFC проверяет версию, которая НИЧЕГО не выполняет при сбое функции, то какая польза от этого? Тогда я думаю, что было бы лучше проверить коды возврата из функций вручную и завершиться с ошибкой, как я уже упоминал в своем вопросе, верно? (Я постараюсь найти больше информации об этом Verify в моем проекте)
  • 0
    @dmcr_code Причина утверждений (или что-то в этом духе) состоит в том, что код сильно терпит неудачу во время тестирования на малейшее несоответствие, в то время как он пытается продолжать работать в производстве. Смысл этого в том, что тихая ошибка считается лучше, чем сбой в производственной среде. Является ли это хорошим подходом, является материалом для длительной дискуссии. В конце концов, это зависит от того, насколько важно, чтобы приложение работало точно, и насколько оно плохо в случае сбоя. Эти приоритеты должны быть взвешены друг против друга для каждого проекта.
Показать ещё 3 комментария
0

Я предполагаю, что вы имеете в виду макрос MFC VERIFY или что-то очень похожее.
Использование этого макроса безопасно для сборки релизов. Аргумент выполняется в любом случае, только сам макрос ничего не делает в выпуске.
В отличие от этого макрос ASSERT полностью пропускается в сборках релизов, поэтому "побочных эффектов" аргумента не происходит. Поэтому VERIFY используется, если аргумент необходим для фактического потока программы, и ASSERT используется, когда аргумент предназначен только для утверждения.

0

Почти наверняка вам не придется их заменять. Если ваш проект хотел просто удалить вызовы в производственной компиляции, у него, вероятно, было бы просто прямое assert напрямую. Попытайтесь прочитать источник проекта (всегда хорошая идея) и понять, что делает его макрос.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню