如何避免使用ifdef使代码更易测试

时间:2018-04-27 10:35:08

标签: c++

我正在创建用于记录信息的日志文件。它有一个开关可以打开或关闭它。

#define LOG_FILE

#ifdef LOG_FILE
    #define LOG(MESSAGE1, MESSAGE2) log(MESSAGE1, MESSAGE2);
#else
    #define LOG(MESSAGE1, MESSAGE2)
#endif

现在我可以使用LOG_FILE开关控制日志记录了。我想知道有没有其他方法可以实现类似的功能更可测试?

1 个答案:

答案 0 :(得分:2)

您可以使用以下模板:

#include <string>
#include <iostream>

#define USE_LOGGING true

template<bool>
inline void log(const std::string& message, const std::string&  verbosity) {}

template<>
inline void log<true>(const std::string& message, const std::string& verbosity) {
    std::cout << verbosity << ": " << message << "\n";
}

constexpr auto logMessage = log<USE_LOGGING>;

int main(int argc, char** argv) {
    logMessage("Test", "Warning");
}

通过这种方式,您将拥有两个版本,使用logMessage为您提供全局设置,或者您可以直接使用log,这是如何使用日志记录的本地定义。