__FILE__显示全路径的问题

BitNebulaVoyant
• 阅读 12335

在日志中,使用到__FILE__来显示源码的文件名,可它显示了绝对路径,这样使得整个log看起来很长,主要log都显示在了右边,让人看着很是不舒服。查找了半天才知道这是编译造成的,由于编译目录和源码目录不同,所以在实际编译的时候使用的是源码的绝对路径,以致打印出来就是绝对路径了(这样的解释不是很准确,有待改进)。

针对这种现象,使用以下的例子作为测试。

#include <stdio.h>

int main(int argc, char **argv)
{
    printf("%s, %d\n", __FILE__, __LINE__);

    return 0;
}

使用源码的全路径编译:

$ gcc -o filetest /srv/example/c/test/filetest.c

执行结果:

$ ./filetest 
/srv/example/c/test/filetest.c, 5

为了解决以上问题,当然可以改变编译的方式:

$ gcc -o filetest filetest.c

执行结果:

$ ./filetest 
filetest.c, 5


可对项目而言,改动一下会牵动很多的东西,那么可以对__FILE__进行一些操作:

#define __FILENAME__ (strrchr(__FILE__, '/') ? (strrchr(__FILE__, '/') + 1):__FILE__)

测试代码修改如下:

#include <string.h>
#include <stdio.h>

#define __FILENAME__ (strrchr(__FILE__, '/') ? (strrchr(__FILE__, '/') + 1):__FILE__)

int main(int argc, char **argv)
{
    printf("%s, %d\n", __FILENAME__, __LINE__);

    return 0;
}

执行结果:

$ ./filetest 
filetest.c, 8

考虑到以上的操作需要两次执行strrchr,这种方案也被枪毙掉了。最后采取了换行的操作,只是使用脚本去分析log文件时有很大的不便,不能快速定位到哪个文件,毕竟它们显示在不同行上。

点赞
收藏
评论区
推荐文章
皕杰报表(关于日期时间时分秒显示不出来)
在使用皕杰报表设计器时,数据据里面是日期型,但当你web预览时候,发现有日期时间类型的数据时分秒显示不出来,只有年月日能显示出来,时分秒显示为0:00:00。1.可以使用tochar解决,数据集用selecttochar(flowdate,"yyyyMMddHH:mm:ss")fromtablename2.也可以把数据库日期类型date改成timestamp
皕杰报表(关于如何上传和下载文件到数据库)
在皕杰报表中文件是否可以上传到数据库中,当然是可以的。然后在附件上传和下载中,设置相对路径或绝对路径,文件名称,文件类型和上传的空值条件(上传的大小,默认限制是5120kb和满足什么条件时上传)。在下载中选择相对路径或绝对路径,填写下载链接名称和下载文件名称。填报操作时有三个函数:filedata、filename、filepath。filedata:获取文
Aaron445 Aaron445
4年前
46个Linux面试常见问题送给你
问题一:绝对路径用什么符号表示?当前目录、上层目录用什么表示?主目录用什么表示?切换目录用什么命令?答案:绝对路径:如/etc/init.d当前目录和上层目录:./ ../主目录:/切换目录:cd
Stella981 Stella981
3年前
Android studio 解决问题Default Activity not found
昨天新建的项目,今天打开的时候,发现无法编译了。编译按钮无法点击,必须editconfiguration。并且报错defaultactivity notfound从网上搜索了解决方案。第一步:在AndroidMainfest.xml文件中,将设置成main的activity的路径。写成绝对路径,也就是需要packageName.cla
Wesley13 Wesley13
3年前
Java自动加载程序目录下的jar包
Java有个比较傻的地方,没有提供从程序目录加载jar包的功能,包括classpath等的配置,全部基于【相对于当前工作目录路径】和【绝对路径】两种,并没有【相对于程序路径】。网上找了一些资料,东拼西凑把这个功能实现了。在需要的时候调用即可。packageexample.autoload;importjava.io.
Wesley13 Wesley13
3年前
Java中
javacclasspath的使用:javac:如果当前你要编译的java文件中引用了其它的类(比如说:继承),但该引用类的.class文件不在当前目录下,这种情况下就需要在javac命令后面加上classpath参数,通过使用以下三种类型的方法来指导编译器在编译的时候去指定的路径下查找引用类。(1).绝对路径:javac
Stella981 Stella981
3年前
Linux dirname、basename 指令
一、dirname指令1、功能:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)2、用法:dirnamefilename例如下面几个例子(1)dirname/etc/sysconfig/networkscripts/ifcfgeth0/etc/sysconfig/network
Stella981 Stella981
3年前
Linux文件路径、cd命令、mkdir、rmdir、rm命令
第二章文件、目录管理2.6相对路径和绝对路径相对路径相对路径就是相对当前目录来说的,比如我当前在/root下,那么要表示/root/213/可以直接ls213/绝对路径绝对路径是从/(也被称为根目录)开始的,比如/usr、/etc
3A网络 3A网络
2年前
如何高效查看 Docker 日志
如何高效查看Docker日志开发基于Docker的应用时,用好log可以大大提高排错效率,下面就是几个常用的log操作技巧:显示所有log显示实时log使用tail查看log尾部使用grep过滤log根据时间查看log组合使用把日志写入文件1.显示所有logjavascript显示某个容器的所有log$
Python进阶者 Python进阶者
2年前
Python -Flask HTML <img 显示本地图片失败,怎么破?
大家好,我是皮皮。一、前言前几天在Python白银群【膨】问了一个Flask图片显示的问题,这里拿出来给大家分享下。运行之后图片加载不出来。二、实现过程这里【此类生物】给了一个思路,flask运行当前路径是主程序路径,把图片路径改成绝对路径。结果页面还是加
深入理解 Flutter 图片加载原理 | 京东云技术团队
Flutter官方为我们提供了Image控件可实现图片的加载及显示,Image控件本身是一个StatefulWidget,那么在图片显示过程中是如何加载及显示出来的呢?本篇文章将逐步分析Flutter中图片加载原理,理解了Flutter图片源码的加载原理后对我们有什么帮助?