C++使用宏来方便定位打印 log

写程序经常需要 printf 运行信息,使用 Macro 可以方便地在 printf 时定位到具体的文件、行号和函数

几个重要的 Macro:

__FILE__            //当前文件的完整路径
__LINE__            //当前语句在文件中的行号
__FUNCTION__        //当前的函数

在 macro 的变量前面加上 ##,表示将字面量拼接起来。 加上#代表将字面量转变成字符串;

附带定位的 log 打印宏:

1 #include <cstring>
2 
3 #define LOG(fmt, ...) \
4     printf("%s | %d | %s() : "fmt, strrchr(__FILE__, '/')+1, __LINE__, __FUNCTION__, ##__VA__ARGS__)
5 
6 
7 LOG("totalnum:", num);

其中 strrchr(__FILE__, '/')+1 的意思是把路径中的文件名提取出来,而不需要把整个文件的路径名都打印出来。

 __VA__ARGS__ 代表的是 macro 里面的可变参数,即 LOG 里面的类似于C语言的 ... 可变数目参数。

 

最后的打印效果类似于:

main.cpp | 24 | main() : totalnum: 67

附: strrchr(s, ch)会返回字符串 s 中字符 ch 最后一次出现的位置(指针),因此路径上最后一次 '/' 之后的内容就是文件名了。

参考:这篇博客讲得不错。这篇博客是错的,编译器会报error,但是我的 macro 是参照他的写的。

posted on 2017-03-10 17:57  daghlny  阅读(1164)  评论(0编辑  收藏  举报

导航