使用 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编程学堂