#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

posted @ 2019-10-27 16:59  allMayMight  阅读(1459)  评论(0编辑  收藏  举报