C++ 如果未设置编译符号,如何排除方法?如何传递可变数量的参数并在函数体中格式化它们?
我编写了自己的简单日志类。我知道我最好使用某种库(boost.log、log4cpp?),但我们还是来讨论一下我的简单类: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
#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);
下面的两个应该可以帮助你和@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