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

how to exclude method if compilation symbol is not set? how to pass variable number of parameters and format them in function body?

本文关键字:参数 格式化 函数体 符号 编译 设置 何排除 方法 如果 排除 何传递      更新时间:2023-10-16

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

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

#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

我希望我的方法接受可变数量的参数,这样我就可以传递像"错误代码:%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