условное удаление макросов

У меня есть такие коды:

    #define SUPPORTS_LOGGING

class Logger {
// ...
template<typename... Args>
void info(const char* fmt, const Args&... args) { /*...*/ }
// ...
};

Logger logger_ {};

void someMethod() {
#ifdef SUPPORTS_LOGGING
logger_.info("....");
#endif
//....
#ifdef SUPPORTS_LOGGING
logger_.info("....");
#endif
}

Итак, моя проблема заключается в том, что регистрация кода загромождает основной код из-за большого количества #ifdefs. Можем ли мы удалить #ifdefв одной строке? Подобно:

LOG_INFO(logger_, info, "%d%d%d", a, b, c);

И приведенный выше код условно расширяется до: logger_.info("%d%d%d", a, b, c); если SUPPORTS_LOGGING определено.

Можем ли мы сделать это?

-1

Решение

Конечно вы можете:

#ifdef SUPPORTS_LOGGING
#define LOG_INFO(Logger, Info, ...) do { Logger.Info(__VA_ARGS__); } while (false)
#else
#define LOG_INFO(Logger, Info, ...) do {} while (false)
#endif

Это похоже на то, как стандартный макрос assert определяется на основании наличия / отсутствия макроса NDEBUG,

4

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector