当前位置: 技术问答>linux和unix
如何写个log包装函数从而不必每次调用时都要传__FILE__,__LINE__?
来源: 互联网 发布时间:2015-03-26
本文导语: 例如log函数调用方式是log("open db failed:%s", "Hello, world!"), 而其效果相当于log("[file:%s,line:%d] open db failed: %s", __FILE__, __LINE__, "Hello, world!") 调用log的形式是: void log(const char *fmt, ...); | 可以设两...
例如log函数调用方式是log("open db failed:%s", "Hello, world!"),
而其效果相当于log("[file:%s,line:%d] open db failed: %s", __FILE__, __LINE__, "Hello, world!")
调用log的形式是:
void log(const char *fmt, ...);
而其效果相当于log("[file:%s,line:%d] open db failed: %s", __FILE__, __LINE__, "Hello, world!")
调用log的形式是:
void log(const char *fmt, ...);
|
可以设两个全局变量:
char *filename;
int *line;
定义一个宏如下:
#define log filename=__FILE__,line=__LINE__,_log
_log函数原型:void _log(const char *fmt, ...);
_log函数中使用全局变量filename和line.
以上适用于单线程的情况。
如果要使用于多线程的环境中,可以将filename和line实现为
函数,就像errno在多线程的情况下的实现那样。其中要使用
thread specific数据。
|
如果是变长参数,不好实现。
用函数好像不行,因为那样__FILE__,__LINE__会被替换
成该函数所在的文件和相应的行号
用函数好像不行,因为那样__FILE__,__LINE__会被替换
成该函数所在的文件和相应的行号
|
什么意思?
如果你闲敲的太长,用一个宏替换不就行了?
如果是变长,用函数也可以阿。
如果你闲敲的太长,用一个宏替换不就行了?
如果是变长,用函数也可以阿。
|
更正:
上文中的 int *line 应为 int line.
上文中的 int *line 应为 int line.