2

我编写了自己的简单日志类。我知道我最好使用某种库(boost.log,log4cpp?),但无论如何让我们讨论一下我的简单类:

#include "stdafx.h"
#include "Logger.h"


Logger::Logger(std::string fileName)
{
    logFile.open(fileName);
}


Logger::~Logger(void)
{
    logFile.close();
}


void Logger::Error(std::string message) {
    logFile << message << std::endl;
}

void Logger::Debug(std::string message) {
    logFile << message << std::endl;
}
  1. 我希望我的方法接受可变数量的参数,所以我可以传递这样的参数"Error code: %x", code。怎么做?
  2. 如果未设置编译符号,我希望Debug排除方法。LOG_DEBUG在 C# 中,我可以[Conditional("LOG_DEBUG")]在方法声明之前添加,但现在要在 C++ 中执行此操作?

upd关于1我已经尝试过并且它有效:

void Logger::Debug(std::string message, ...) {
va_list arglist;
fprintf(pFile, message.c_str(), arglist);
4

2 回答 2

5

在我看来,最简单的方法是为此使用宏:

#define LOG_DEBUG(logger, output) \
    do { logger.getStream() << "DEBUG: " << output << std::endl; } while (0)

LOG_DEBUG(logger, "Some value = " << some_value);

这将允许您使用所有普通的 C++ 流操纵器。


至于第二部分,它也是简单的预处理器技巧:

#ifdef DEBUG
# define LOG_DEBUG(logger, output) do { ... } while (0)
#else
# define LOG_DEBUG(logger, output)
#endif
于 2012-11-26T12:11:39.937 回答
4

我希望我的方法接受可变数量的参数,所以我可以传递像“错误代码:%x”这样的参数,代码。怎么做?

您有两种解决方案:

  1. 使用类似 printf 的格式。这将需要使用 va_list、va_arg 和 va_end 宏。

  2. 使用运算符重载(如@Joachim 的回答)。

如果未设置 LOG_DEBUG 编译符号,我希望排除调试方法。在 C# 中,我可以在方法声明之前添加 [Conditional("LOG_DEBUG")] ,但现在要在 c++ 中做到这一点?

您可以通过两种不同的方式定义日志记录宏,具体取决于 DEBUG 宏定义(或 NDEBUG 或类似的东西):

#ifdef DEBUG
#define LOGE(X) Logger::Error(X)
#define LOGD(X) Logger::Debug(X)
#else
#define LOGE(X) 
#define LOGD(X) 
#endif
于 2012-11-26T12:56:09.343 回答