Привет, я программирую на каком-то устройстве. Существует пример с таким кодом:
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
}
Невозможно сказать, так как кажется, что именно ваш проект реализует Verify
, как макрос или как функцию. Почему бы вам не взглянуть на реализацию?
При этом в MFC-инфраструктуре есть макрос VERIFY
, аналогичный ASSERT
, с тем отличием, что выражение всегда оценивается даже в сборке релиза, но ничего не делает, если результат выражения ложный. Это может быть аналогичный подход, так как ваши примеры, похоже, вызывают некоторые функции, которые могут повлиять на состояние системы.
Я предполагаю, что вы имеете в виду макрос MFC VERIFY или что-то очень похожее.
Использование этого макроса безопасно для сборки релизов. Аргумент выполняется в любом случае, только сам макрос ничего не делает в выпуске.
В отличие от этого макрос ASSERT полностью пропускается в сборках релизов, поэтому "побочных эффектов" аргумента не происходит. Поэтому VERIFY используется, если аргумент необходим для фактического потока программы, и ASSERT используется, когда аргумент предназначен только для утверждения.
Почти наверняка вам не придется их заменять. Если ваш проект хотел просто удалить вызовы в производственной компиляции, у него, вероятно, было бы просто прямое assert
напрямую. Попытайтесь прочитать источник проекта (всегда хорошая идея) и понять, что делает его макрос.