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 最后一次出现的位置(指针),因此路径上最后一次 '/' 之后的内容就是文件名了。