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

C++ 如果未设置编译符号,如何排除方法?如何传递可变数量的参数并在函数体中格式化它们?,c++,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::st

我编写了自己的简单日志类。我知道我最好使用某种库(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;
}

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

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

LOG_DEBUG(logger, "Some value = " << some_value);
我希望我的方法接受可变数量的参数,这样我就可以传递类似“错误代码:%x”这样的参数。怎么做

您有两种解决方案:

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

LOG_DEBUG(logger, "Some value = " << some_value);
  • 使用类似printf的格式。这需要使用va_list、va_arg和va_end宏

  • 使用操作符重载(如@Joachim的答案)

  • 如果未设置日志调试编译符号,我希望排除调试方法。在C++中,我可以在方法声明之前添加[条件(“LogiDebug”)],但是现在在C++中使用了[/p>]。 根据调试宏定义(或NDEBUG或类似定义),可以用两种不同的方式定义日志宏:


    下面的两个应该可以帮助你和@Caribou抱歉,我刚刚开始学习c++@javapowered不需要抱歉(我没有记下这个btw)Joachims的回答是一个好的开始。您可以扩展宏并添加更多params@Caribou我需要一些简单的方法在发布版本时排除任何日志记录,但要将其保留在调试版本中。我甚至不想有任何“额外的比较”,我真的希望编译器只排除日志记录,因为我关心发布版本中的延迟。@这正是使用Joachims answer可以实现的-如果您有调试测试(或您选择的定义)-如果为真,则定义如下,如果不定义日志调试(记录器,输出)空-在Google上查找预处理器,我可能只是将“…”参数转发给某个函数
    sprintf
    ?可以自动使用它们。。。
    #ifdef DEBUG
    # define LOG_DEBUG(logger, output) do { ... } while (0)
    #else
    # define LOG_DEBUG(logger, output)
    #endif
    
    #ifdef DEBUG
    #define LOGE(X) Logger::Error(X)
    #define LOGD(X) Logger::Debug(X)
    #else
    #define LOGE(X) 
    #define LOGD(X) 
    #endif