#define __FILENAME__ (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__) 的更好方案
在c++里面用来打log你可能会用到如下宏定义
#define __FILENAME__ (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__)
strrchr函数寻找目标字符串中,第二个参数(字符类型)最后出现的位置(返回的是指针),但这个函数在没有找到第二个参数时返回空指针。
假如你的源文件路径为your/path/to/file.cpp
,那么__FILENAME__
宏展开后就是指向file.cpp
第一个字符的指针了(即指针指向了最后一个/
的下一个字符)。但上面这行代码用到了三目表达式,这里就有了分支,本人在编写单元测试时,这行代码的第二个分支永远测不到(因为我的源代码路径根本不会放到根目录)(本人用的gcov覆盖率生成工具)。
为了解决分支测不到的问题,而且还为了避免返回一个空指针,所以用如下代码:
#define __FILENAME__ (strrchr("/" __FILE__, '/') + 1)
通过给__FILE__
宏前面添加一个/
,这样就算源代码放在了根目录,也可以返回去掉层级的源文件名字。而且这样就用不到三目表达式了,也就不会产生分支了。
stackoverflow友情链接:
__FILE__
macro shows full path