有条件地删除宏

时间:2018-06-25 15:34:53

标签: c++ c++11 c-preprocessor

我有这样的代码:

    #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,记录代码会使主代码混乱。我们可以在一行中删除#ifdef吗?喜欢:

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

以上代码有条件地扩展为:logger_.info("%d%d%d", a, b, c);(如果定义了SUPPORTS_LOGGING

我们可以这样做吗?

1 个答案:

答案 0 :(得分:4)

您当然可以:

#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的方式类似。