Задать вопрос
@Acaunt

Имеет ли место быть использование кодогерерирующих макросов для Debug версии приложения, а на Realise их отсутствие?

Для Debug версии приложения я бы хотел получать сообщения о ходе выполнения работы, чтобы лучше отлаживать его в случае ошибок, а на релизе всё это вспомогательное удалить не переписывая весь код. Для этой цели я придумал следующие макросы (и пример кода использования):

#define DEBUG true

#if DEBUG

#define COMMA ,
#define LOCATION(name) const std::source_location& name = std::source_location::current()
#define PARAMETER(name) name

#else

#define COMMA
#define LOCATION(name)
#define PARAMETER(name)

#endif

void foo(int value COMMA LOCATION(loc)) {
    static constexpr std::string_view message = DEBUG ? "value = {} In [{}, {}] file: {}" : "value = {}";
    std::println(
        message,
        value COMMA
        PARAMETER(loc.line()) COMMA
        PARAMETER(loc.column()) COMMA
        PARAMETER(loc.file_name())
    );
}


Пример не совсем корретен, но думаю идею я передал. Хотел бы выслушать ваши предложения и замечания.
  • Вопрос задан
  • 132 просмотра
Подписаться 1 Простой 4 комментария
Помогут разобраться в теме Все курсы
  • Академия Эдюсон
    Разработчик игр на Unreal Engine + ИИ
    9 месяцев
    Далее
  • Нетология
    Разработчик на C++
    12 месяцев
    Далее
  • Skillbox
    Профессия Разработчик С++
 с нуля + ИИ
    7 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 4
opium
@opium
Просто люблю качественно работать
Не меняй макросами сигнатуру foo() — оберни макросом только вызов лога
Ответ написан
@Zerg89
По идее при компиляции достаточно сделать define DEBUG false и выставить оптимизацию кода даже на минимальный уровень и это будет удалено компилятором так как будет считатся неисполняемой функцией

Еще вариантconstexpr bool DEBUG = false чтобы при компиляции было четко предопрделено что функция не может быть исполнена

Офтоп хотя может наоборот стоить это оставить чтобы дебажить уже скомпилированный код
Ответ написан
@res2001
Developer, ex-admin
На счет макроса DEBUG - все уже придумано до нас :)
Есть стандартный макрос NDEBUG. Его добавляет компилятор к release сборке и удаляет в debug, т.е. действие обратное вашему, но смысл тот же. Только с ним нюанс - он обычно значения не имеет, поэтому его надо проверять на #ifdef/#ifndef.
Так же есть чудесное средство assert, которые работают только в debug сборке - можно проверять различные условия, инварианты, на входе в функции и т.п. Крайне рекомендую. В релизе все assertы удаляются. Если посмотреть как они определены в стандартной библиотеке, то там обычно используется макрос NDEBUG.
И да, изменять макросами сигнатуру функции - так себе идея, я бы не делал.
Ответ написан
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Имеет. Так, например, в хромиуме делается отладочный вывод: https://source.chromium.org/chromium/chromium/src/...

Он правда сильно усложнен по сравнению с вашим, но умеет сильно больше чего.
Используется как обычный cerr, но в релизе вообще ничгео не делает и компилятор его вообще за ненадобностью вырезает.

А еще есть DCHECK - для ассертов, которые не надо в релизный билд компилировать: https://source.chromium.org/chromium/chromium/src/...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы