如果未设置编译符号,如何排除方法?如何传递可变数量的参数并在函数体中格式化它们
how to exclude method if compilation symbol is not set? how to pass variable number of parameters and format them in function body?
我编写了自己的简单日志记录类。我知道我最好使用某种库(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;
}
- 我希望我的方法接受可变数量的参数,这样我就可以传递这样的参数
"Error code: %x", code
。怎么做? - 如果未设置编译符号
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"这样的参数,代码。怎么做?
您有两种解决方案:
-
使用类似 printf 的格式。这将需要使用va_list、va_arg和va_end宏。
-
使用运算符重载(如@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
相关文章:
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 无法从 spdlog 中格式化参数
- 为什么EclipseCDT代码格式化程序有时会在模板参数中引入空格
- C++fmt库,只使用格式说明符格式化单个参数
- 使用参数的可变大小向量格式化字符串(例如,将参数向量传递给 std::snprintf)
- 可变参数模板必须具有可调用的专用化,非空参数包才能正确格式化
- 如果未设置编译符号,如何排除方法?如何传递可变数量的参数并在函数体中格式化它们
- 在窗口上将格式化的 C 字符串和参数转换为 wstring
- 在回溯跟踪中格式化 GDB 模板参数
- 字符串参数与用于格式化的模板参数
- 为什么 printf 不格式化 unicode 参数?
- 如何在pgsql中格式化数组参数
- QString参数模糊-格式化%1000%2与参数
- c++将格式化字符串作为参数传递给函数
- 格式化不是字符串字面值,也没有格式参数
- C++输出格式化变量参数列表的最佳方法
- 如何确定需要多少参数来实现fprint格式化字符串