В настоящее время мы используем #ifdef DEPLOYED
для идентификации развернутых сборок нашего проекта c ++ 17 и изменения поведения.
Однако, stati c анализ кода, например, часто внутри IDE (и на на первый взгляд справедливо) предупреждает о неиспользуемых переменных, которые в прошлом я опрометчиво удалял, чтобы потом позже выяснить в нашей ночной, что сборка развертывания не удалась (потому что в нашем CI тестирование выполняется на сборках без развертывания, только ночное развертывание сборки с включенным флагом).
Один из многих примеров:
catch (std::exception& e) {
#if defined(DEPLOYED)
std::cerr << "Exception doing something " << e.what() << std::endl;
#else
throw;
#endif
}
На компьютере разработчика e
никогда не использовался, поэтому возникло предупреждение, catch (std::exception& e) {
был изменен на catch (std::exception&) {
, поэтому не удалось развернуть сборки.
Как это могло быть написано по-другому? Одно решение, которое я имел в виду, выглядит следующим образом, но это очень громоздко, и мне интересно, можно ли это сделать более элегантно:
catch (std::exception& e) {
if (
#if defined(DEPLOYED)
true
#else
false
#endif
) {
std::cerr << "Exception doing something " << e.what() << std::endl;
} else {
throw;
}
#endif
}
Другой пример включает переименование переменной , которое было сделано везде (Поддерживается IDE "заменить все вхождения), кроме блоков кода #if defined(DEPLOYED)
.
- Не модно ли обрабатывать сборки dev и deploy в C ++ с
define
? Если да, то что рекомендуемый способ? - Особенно, когда не развернутый код может содержать вычислительно дорогие вызовы, как мне убедиться, что они не появляются в сборках развертывания - может быть, даже могут быть полностью оптимизированы?