【C语言进阶】C语言编译 __FILE__ 转成 __FILENAME__ 的方法

架构师李肯 发表于 2022/10/31 19:53:23 2022/10/31
【摘要】 一个小小的功能需求,花点心思很容易就可以实现。

【C语言进阶】C语言编译 __FILE__ 转成 __FILENAME__ 的方法

一个小小的功能需求,花点心思很容易就可以实现。

1 需求说明

我们在C语言编程的时候,打印调试信息,会使用 __FILE__ 打印当前源码文件的路径,但是细心的朋友可能会发现,这个文件路径是一个相对路径,如果源码文件的目录很深时,这个 __FILE__ 打印出来就会很冗长,那么我们有没有办法可以解决这个问题呢?让它打印的时候只打印文件名称?

2 实现方法

根据功能需求,这里介绍一种利用Makefile给编译器(以gcc编译器为例)传递编译参数的方式做一下转换。

假设有这样的目录结构:

image-20221031194505527

然后我们要编译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华为云云享专家(嵌入式物联网架构设计师)等荣誉。坚信【知识改变命运,技术改变世界】!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。