условное удаление макросов - PullRequest
0 голосов
/ 25 июня 2018

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

    #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
    }

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

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

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

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

1 Ответ

0 голосов
/ 25 июня 2018

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

#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.

...