csr8615 mcu:C++临时变量的另类应用:基于iostream的类型安全的log接口设计
来源:百度文库 编辑:偶看新闻 时间:2024/05/15 06:48:13
C++临时变量的另类应用:基于iostream的类型安全的log接口设计
几年前做的一个东西,现在专注于系统底层开发,C++的高级功能用的比较少了,写出来回忆回忆。在实际的应用开发中,log模块设计是必 不可少的一部分,log模块设计的好坏直接影响到系统的性能和日后的维护。总的来说,log模块在功能上除了日志级别、时间和消息正文这些必须的信息外, 最好还能记录日志产生时尽可能多的信息,比如线程ID、模块名称、源文件、代码行等。在log接口的设计上应该尽可能简化,以方便调用。一个调用起来很麻 烦的接口,估计是没人想用的。
在基于C/C++开发的应用中,log接口通常设计成带可变参数的
void __cdecl PrintLog(int log_level, const char* format, ...);
对C 程序员这是很合理的选择。但是对于强调强类型安全的C++来说
类似于printf的其他iostream替代者,我们希望log接口
log << "test for iostream log";
log << "fopen failed. errno=" << errno;
但是对于log来说,用iostream的一个问题在于如何界定一条完整的log信息
同时,log level和log time也是log信息的必要组成部分,必须要记录
log << loglvl_info << log_time << "test for iostream log";
log << loglvl_err << log_time << "fopen failed. errno=" << errno;
估计没有谁喜欢用。还有一个要注意的是
这些问题中,最关键的是第一个问题,即如何从多个流操作中界定一条完
class logstream : public std::ostream
{
public:
explicit logstream();
~logstream()
{
write_log(m_szLogText);
}
//...
};
要产生log时这样调用:
logstream() << "fopen failed. errno=" << errno;
在这条语句结束时,logstream()临时变量被析构
#define LL_ERROR 1
#define LL_INFO 2
class logstream : public std::ostream
{
public:
explicit logstream( int level);
~logstream()
{
write_log(m_szLogText);
}
};
#define logerr logstream( LL_ERROR)
#define loginfo logstream( LL_INFO)
这样调用log接口:
logerr << "fopen failed. errno=" << errno;
上面这行其实有一个问题:在C++标准草案中,临时变量是r
我这里的work-around利用了r-value可以调用成员函数,而成员函数可以返回non
class logstream : public std::ostream
{
public:
explicit logstream( int level);
~logstream();
logstream& l_value() { return *this; }
};
#define logerr logstream( LL_ERROR).l_value()
#define loginfo logstream( LL_INFO).l_value()
关于临时变量的一个比较详细的讨论可以看这里。另外一个要注意的问题是要保证析构函数中的所有操作都不能抛出异常
附 录给出了一份比较完整的logstream接口代码。由于logstream基于iostream,其接口非常简单易用,继承了iostream的很多优 点:如对所有数据类型具有一致性的接口,支持iostream library原先支持的所有数据类型,扩展能力很强-新增数据类型对iostream的重载自动适用于logstream。除此之外,该 logstream是线程安全的。对于每条log信息,除了基本的log level和log time之外,logstream还能记录生成每条log 的线程ID、模块名称、源文件代码行、函数名等信息。
附:比较完整的logstream接口部分代码。
基于WEB数据库的应用
c盘的另类减肥
MSComm中Variant变量的应用问题。
C定义变量的问题
c语言的指针变量
变量的变化??c语言
ftp另类整合应用
FTP另类应用
另类智慧的重要性以及伟人应用另类智慧的实例
临时变量空间是什么概念?
javascritp变量应用问题
基于模糊AHP法的水质评价模型及其应用
特尔斐法(专家意见法)基于网络的应用
特尔斐法(即专家意见法)基于网络的应用
基于构件应用开发的优点有哪一些啊
讨论以下问题:基于Web应用的构件
基于SNMP++的阻塞模式收发应用研究
基于网络应用的设计服务都有哪些?
追问:powerbuild一般用于开发基于什么语言的应用?
关于c里面static变量的问题
C:\Program Files的变量是什么?
C语言 有关变量名的问题
( )是C语言合法的变量名?
C语言函数,变量命名的问题