C语言宏定义使用优化日志调试


使用 QQ物联提供的 SDK 进行开发的时候,SDK 提供的源码中,调试代码可以如下:

TNOTICE("User Login:  user:%s, pwd:%s",user,pwd);

此时,使用 TNOTICE 宏进行数据的输出;

该宏会输出当前调试信息所在的 行号,文件名,当前时间等信息;

//========================================================================

最终,我们自己需要输出的信息 "User Login:  user:%s, pwd:%s" 能够直接完整地输出;

该宏输出的定义是:

fprintf(stdout, "NOTICE:[%s][%d]:[%s:%d]:" fmt"\n", get_time().c_str(), getpid(), __FILE__, __LINE__ , ##__VA_ARGS__);

所以,需要注意 2 个地方:

1 fmt 参数,直接和 "NOTICE ..." 字符串拼接起来,没有任何符号进行连接;

2 ##__VA_ARGS__ 变量,是系统提供的宏,直接把用户需要输出的 多个 变量进行数据输出;

//========================================================================

测试例子如下:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
#include <sys/select.h>
#include <sys/time.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define TLOG_NOTICE 0
#define TLOG_WARNING 1
#define TLOG_ERROR 2

#define TLOG(LEVEL, fmt, ...)\
do {\
if (TLOG_NOTICE == LEVEL)\
fprintf(stdout, "NOTICE:[%s][%d]:[%s:%d]:" fmt"\n", "cur time", getpid(), __FILE__, __LINE__ , ##__VA_ARGS__);\
else if (TLOG_WARNING == LEVEL)\
fprintf(stdout, "WARNING:[%s][%d]:[%s:%d]:" fmt"\n", "cur time", getpid(), __FILE__, __LINE__ , ##__VA_ARGS__);\
else if (TLOG_ERROR == LEVEL)\
fprintf(stdout, "ERROR:[%s][%d]:[%s:%d]:" fmt"\n", "cur time", getpid(), __FILE__, __LINE__ , ##__VA_ARGS__);\
} while(0)

#define TNOTICE(fmt, ...)\
TLOG(TLOG_NOTICE, fmt, ##__VA_ARGS__)
#define TWARNING(fmt, ...)\
TLOG(TLOG_WARNING, fmt, ##__VA_ARGS__)
#define TERROR(fmt, ...)\
TLOG(TLOG_ERROR, fmt, ##__VA_ARGS__)

//================================================
//================================================
int main(void)
{
    TNOTICE("User Login:  user:%s, pwd:%s", "admin", "123456");
    return 0;
}
//========================================================================

运行结果如下:

[root@localhost64 test]# gcc test1.c -o test1
[root@localhost64 test]# ./test1
NOTICE:[cur time][8235]:[test1.c:51]:User Login:  user:admin, pwd:123456
[root@localhost64 test]# 

//========================================================================

我们可以精简出适合自己使用的调试接口,如下:

#define TLOG_NOTICE 0
#define TLOG_WARNING 1
#define TLOG_ERROR 2

#define TLOG(LEVEL, fmt, ...)\
do {\
    if (TLOG_NOTICE == LEVEL)\
    fprintf(stdout, "%s(%d)" fmt"\n", __FILE__, __LINE__ , ##__VA_ARGS__);\
    else if (TLOG_WARNING == LEVEL)\
    fprintf(stdout, "WARNING:[%s:%d]:" fmt"\n", __FILE__, __LINE__ , ##__VA_ARGS__);\
    else if (TLOG_ERROR == LEVEL)\
    fprintf(stdout, "ERROR:[%s:%d]:" fmt"\n",__FILE__, __LINE__ , ##__VA_ARGS__);\
} while(0)

#define LOG(fmt, ...)\
TLOG(TLOG_NOTICE, fmt, ##__VA_ARGS__)
#define LOGW(fmt, ...)\
TLOG(TLOG_WARNING, fmt, ##__VA_ARGS__)
#define LOGE(fmt, ...)\
TLOG(TLOG_ERROR, fmt, ##__VA_ARGS__)

只需要99元就可以投资自己,掌握Linux系统编程!主要传授《Linux C/C++程序设计》《Linux 系统编程》,主页有学习视频!
只需要99元就拥有全部课程和资料,让我们用技术改变自己,改变生活,改变世界!
视频可以百度搜索:韦凯峰Linux编程学堂
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值