C/C++ 实现类似Android JNI log库的效果

来源:互联网 发布:淘宝联盟机器人免费版 编辑:程序博客网 时间:2024/06/06 00:55

封装log

C标准库提供了printf作为日志输出函数
C++中stl提供了std::cout作为日志输出函数

当然这两种接口使用起来都不太方便
printf函数太长 而且日志没有分级别
cout使用起来则更为繁琐

std::cout << "test" << std::endl;

封装printf

常见的封装方法是这样的:

#define log(fmt,...)\            do {\                printf(fmt, ##__VA_ARGS__);\               } while(0)

这样封装后 printf可变参数的优点被保留下来 同时也不需要那么长的函数名

Android SDK中的做法

在Android中使用JNI接口时
可以这么使用日志 Log.i(“tag”, “test”);
类似的接口还有Log.d(),Log.e()
后缀的i e d代表的是日志的级别
i是info e是error d是debug

同样的 通过几个宏定义可以实现这种效果

#define Log.i(fmt,...)\            do {\                printf("info: ");\                printf(fmt, ##__VA_ARGS__);\                printf("\n");\               } while(0)#define Log.d(fmt,...)\            do {\                printf("debug: ");\                printf(fmt, ##__VA_ARGS__);\                printf("\n");\               } while(0)             #define Log.e(fmt,...)\            do {\                printf("error: ");\                printf(fmt, ##__VA_ARGS__);\                printf("\n");\               } while(0)               

这里只是简单的举例
工程应用中还可以加上其他效果
比如 利用 LINE_FILE这些宏 定位log文件位置等等
还可以根据log级别 加上输出log的颜色来区分不同级别的log

阅读全文
0 0
原创粉丝点击