【C语言进阶】C语言编译 __FILE__ 转成 __FILENAME__ 的方法
【C语言进阶】C语言编译 __FILE__ 转成 __FILENAME__ 的方法
一个小小的功能需求,花点心思很容易就可以实现。
1 需求说明
我们在C语言编程的时候,打印调试信息,会使用 __FILE__ 打印当前源码文件的路径,但是细心的朋友可能会发现,这个文件路径是一个相对路径,如果源码文件的目录很深时,这个 __FILE__ 打印出来就会很冗长,那么我们有没有办法可以解决这个问题呢?让它打印的时候只打印文件名称?
2 实现方法
根据功能需求,这里介绍一种利用Makefile给编译器(以gcc编译器为例)传递编译参数的方式做一下转换。
假设有这样的目录结构:

然后我们要编译main.c这个源文件,内容如下:
#include <stdio.h>
int main(void)
{
printf("__FILE__: %s\n", __FILE__);
printf("__CUR_FILE__: %s\n", __CUR_FILE__);
}
我们在顶级目录下建立一个Makefile,其内容是:
all: 111/222/333/444/555/666/777/888/999/main.c
gcc -o test $< -D__CUR_FILE__=\"$(shell basename $<)\"
这样,我们只要输入make all 即可编译出test程序。
recan@ubuntu:~/11111$ make all
gcc -o test 111/222/333/444/555/666/777/888/999/main.c -D__CUR_FILE__=\"main.c\"
我们运行一下test程序,看下结果:
recan@ubuntu:~/11111$ ./test
__FILE__: 111/222/333/444/555/666/777/888/999/main.c
__CUR_FILE__: main.c
我们可以看到:__FILE__ 输出的就是自带的文件系统,非常冗长;而 __CUR_FILE__ 输出的就只有main.c,非常的简洁。
3 小小总结
- 借助Makefile给编译器传递参数可以做很多事情;
- 在Makefile中 **@< ** 表示第一个依赖项,在范例中的Makefile中,这个就是参与编译的C源文件;
- 传递一个宏定义给gcc编译器,可以使用 -Dxxx=yyy 的形式传入,如果是字符串内容,主要双引号要记得转义。
4 更多分享
架构师李肯(全网同名),一个专注于嵌入式IoT领域的架构师。有着近10年的嵌入式一线开发经验,深耕IoT领域多年,熟知IoT领域的业务发展,深度掌握IoT领域的相关技术栈,包括但不限于主流RTOS内核的实现及其移植、硬件驱动移植开发、网络通讯协议开发、编译构建原理及其实现、底层汇编及编译原理、编译优化及代码重构、主流IoT云平台的对接、嵌入式IoT系统的架构设计等等。拥有多项IoT领域的发明专利,热衷于技术分享,有多年撰写技术博客的经验积累,连续多月获得RT-Thread官方技术社区原创技术博文优秀奖,荣获CSDN博客专家、CSDN物联网领域优质创作者、2021年度CSDN&RT-Thread技术社区之星、2022年RT-Thread全球技术大会讲师、RT-Thread官方嵌入式开源社区认证专家、RT-Thread 2021年度论坛之星TOP4、华为云云享专家(嵌入式物联网架构设计师)等荣誉。坚信【知识改变命运,技术改变世界】!
- 点赞
- 收藏
- 关注作者
评论(0)