【发布时间】:2013-07-13 21:22:02
【问题描述】:
我正在尝试实现在不需要时不会产生开销的日志记录(即根本不应该执行任何方法调用)。我想要 NO 开销,因为它是低延迟代码。我刚刚将#define ENABLE_LOGS 添加到我的头类中,现在看起来像这样(您可以忽略细节)
#pragma once
#include <string>
#include <fstream>
#define ENABLE_LOGS
namespace fastNative {
class Logger
{
public:
Logger(std::string name_, std::string fileName, bool append = false);
~Logger(void);
void Error(std::string message, ...);
void Debug(std::string message, ...);
void DebugConsole(std::string message, ...);
void Flush();
static Logger errorsLogger;
static Logger infoLogger;
private:
FILE* logFile;
bool debugEnabled;
};
}
每次我需要使用某种方法时,我都应该这样包围它:
#ifdef ENABLE_LOGS
logger.Debug("seq=%6d len=%4d", seq, length_);
#endif
这是错误电话(我可以忘记环绕)并使代码变脏。我可以以某种方式修复我的代码,不每次都使用#ifdef吗?
在 C# 中我喜欢 Conditional 我想我需要类似的东西用于 c++。
【问题讨论】:
-
查找任何 assert.h - 甚至是 stackoverflow.com/questions/9701229/… 的那个,以了解如何制作可以在一个地方用一个标志关闭的代码。
-
您可以有条件地
#defineDebug 方法在标头中有一个 (inline) 空实现,然后依靠优化器删除什么都不做的函数调用(这假设任何参数都没有' t有副作用)。更传统的方法是直接使用预处理器宏,这种方法更直接,但更容易出错。 -
我假设您也不希望对参数进行评估。如果您想要一个干净的 C++ 外观,这会使事情变得非常复杂。是时候做一些宏了!
-
使用多态性并有一个什么都不做的实现,并使用您的宏选择正确的实现。
-
有趣的是,您关心记录器的性能,但您的记录功能采用
std::string的值。无论如何,看看任何现有的日志库,你可能不会做得比这更好
标签: c++