如果没有设置编译符号,如何排除方法?如何传递可变数量的参数并在函数体中格式化它们?

jav*_*red 2 c++

我为记录编写了自己的简单类.我明白我最好使用某种类型的库(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;
}
Run Code Online (Sandbox Code Playgroud)
  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);
Run Code Online (Sandbox Code Playgroud)

Som*_*ude 5

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

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

LOG_DEBUG(logger, "Some value = " << some_value);
Run Code Online (Sandbox Code Playgroud)

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


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

#ifdef DEBUG
# define LOG_DEBUG(logger, output) do { ... } while (0)
#else
# define LOG_DEBUG(logger, output)
#endif
Run Code Online (Sandbox Code Playgroud)