有条件地删除宏
conditional removal of macros
我有这样的代码:
#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
。
我们能做到吗?
当然可以:
#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
的 presence/absence 定义的。
我有这样的代码:
#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
。
我们能做到吗?
当然可以:
#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
的 presence/absence 定义的。