gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:46:07 27 4
gpt4 key购买 nike

我编写了自己的简单日志记录类。我知道我最好使用某种库(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. 如果未设置 LOG_DEBUG 编译符号,我希望排除 Debug 方法。在 C# 中,我可以在方法声明之前添加 [Conditional("LOG_DEBUG")],但现在要在 C++ 中这样做吗?

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

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

最佳答案

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

#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

关于c++ - 如果未设置编译符号,如何排除方法?如何传递可变数量的参数并在函数体中格式化它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13564488/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com