首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >去掉宏__FILE__的路径

去掉宏__FILE__的路径

作者头像
coderhuo
发布于 2018-08-29 07:24:26
发布于 2018-08-29 07:24:26
4.2K10
代码可运行
举报
文章被收录于专栏:coderhuocoderhuo
运行总次数:0
代码可运行

本文介绍如何去掉宏__FILE__的路径,只显示文件名。

宏__FILE__展开后会带有路径信息,比如下面的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<stdio.h>
#include<stdlib.h>

int main()
{
	printf("file_name:%s\n", __FILE__);
	return 0;
}

如果Makefile内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CFALG = -Wall

all: /home/helloworld/test.c
	gcc $(CFALG) $< -o test

编译运行,程序输出为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
file_name:/home/helloworld/test.c

为了不让宏_FILE__带有路径信息,可以在Makefile中重定义宏__FILE_

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CFALG = -Wall
CFALG += -U__FILE__ -D__FILE__='"$(subst $(dir $<),,$<)"'

all: /home/helloworld/test.c
	gcc $(CFALG) $< -o test

编译运行,程序输出为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
file_name:test.c

取消宏_FILE__会产生编译警告,如果不想产生警告,可以考虑新建一个宏, 比如__FILENAME_

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-04-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
新的cmake版本已经变了,比如3.21.2。偷懒的话可以用$@凑合一下
新的cmake版本已经变了,比如3.21.2。偷懒的话可以用$@凑合一下
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
GCC与MinGW的简单安装与使用
简单的GCC用法 总的来说,gcc应该是一个编译器。但整套的gcc环境并不是由gcc构成的,它是由多个包所组成的,这些包的互相作用产生了gcc的开发环境。其中,有一些包是你开发应用程序所必备的基本包,离开这些包你将无法正常使用gcc。 gcc开发环境包括如下几大包: binary 基本包 提供基本的汇编器,连接器等 gcc 基本包 各种语言的编译器,包括C,C++,Ada,Java等 Win32api,mingwi-runtime/glibc 基本包 系统函数库 make/automake 需要包 管理项目编译的程序 gdb 附加包 调试程序 一. 常用编译命令选项 假设源程序文件名为test.c。 1. 无选项编译链接 用法:#gcc test.c 作用:将test.c预处理、汇编、编译并链接形成可执行文件。这里未指定输出文件,默认输出为a.out。编译成功后可以看到生成了一个a.out的文件。在命令行输入./a.out 执行程序。./表示在当前目录,a.out为可执行程序文件名。 2. 选项 -o 用法:#gcc test.c -o test 作用:将test.c预处理、汇编、编译并链接形成可执行文件test。-o选项用来指定输出文件的文件名。输入./test执行程序。 3. 选项 -E <大写,注意> 用法:#gcc -E test.c -o test.i 作用:将test.c预处理输出test.i文件。 4. 选项 -S <大写,注意> 用法:#gcc -S test.i 作用:将预处理输出文件test.i汇编成test.s文件。 5. 选项 -c 用法:#gcc -c test.s 作用:将汇编输出文件test.s编译输出test.o文件。 6. 无选项链接 用法:#gcc test.o -o test 作用:将编译输出文件test.o链接成最终可执行文件test。输入./test执行程序。 7. 选项-O 用法:#gcc -O1 test.c -o test 作用:使用编译优化级别1编译程序。级别为1~3,级别越大优化效果越好,但编译时间越长。输入./test执行程序。 二. 多源文件的编译方法 如果有多个源文件,基本上有两种编译方法: [假设有两个源文件为test.c和testfun.c] 1. 多个文件一起编译 用法:#gcc testfun.c test.c -o test 作用:将testfun.c和test.c分别编译后链接成test可执行文件。 2. 分别编译各个源文件,之后对编译后输出的目标文件链接。 用法: #gcc -c testfun.c //将testfun.c编译成testfun.o #gcc -c test.c //将test.c编译成test.o #gcc testfun.o test.o -o test //将testfun.o和test.o链接成test 以上两种方法相比较,第一中方法编译时需要所有文件重新编译,而第二种方法可以只重新编译修改的文件,未修改的文件不用重新编译。 三. gcc的常用编译参数 同VC,TC等编译器不同,gcc其实是可以很方便的在提示符下编译程序的。gcc在提示符下编译程序,并没有如同VC那样的冗长而晦涩的编译参数。相反,却有着比VC更灵活且简短的参数。 不得不承认,不懂gcc编译参数的人,确实会损失一些gcc的强大功能。所以,我下面简单介绍一下gcc的一些基本编译参数。这里,我以C编译器为例。 注意:gcc的编译参数是区分大小写的。 编译二进制代码 gcc -c yours.c -o yours.o 使用这段指令,gcc将会把yours.c编译成yours.o的二进制代码。其中,yours.o就类似于VC,TC中的.obj文档。 编译最简单的小程序 gcc -o yours yours.c 通过这条指令,gcc将会把yours.c源代码编译成名为yours的可执行程序。当然,您也可以将yours.c改成我们刚才介绍的yours.o文件。这样,gcc将使用编译刚才编译好的二进制文档来链接程序。这里,格式的特点是,-o 后面是一串文件列表,第一个参数是所编译程序的文件名,从第二个开始,就是您编译和连接该可执行程序所需要的二进制文档或者源代码。 编译时将自己的头文件目录设为默认头文件目录 gcc -I”Your_Include_Files_Document_Path” -c yours.c -o yours.o 这条指令中的-I参数将会把Your_Include_Files_Document_Path添加到你默认的头文件目录中。这样您将可以使用 #include <your_include.h>来导入头
云未归来
2025/07/21
1100
实用 | 10分钟教你通过网页点灯
上一篇我们已经基于我们的开发板搭好了一个基于boa的web服务器:实用 | 10分钟教你搭建一个嵌入式web服务器。这一篇接着分享如何使用网页来点灯。
用户2366192
2021/08/27
7400
实用 | 10分钟教你通过网页点灯
GDB调试入门,看这篇就够了
GDB(GNU Debugger)是UNIX及UNIX-like下的强大调试工具,可以调试ada, c, c++, asm, minimal, d, fortran, objective-c, go, java,pascal等语言。本文以C程序为例,介绍GDB启动调试的多种方式。
编程珠玑
2019/07/23
7.9K0
GDB调试入门,看这篇就够了
宏(预编译)详解
在学习预编译之前我们有必要先大致了解一下一个程序从开始到结束的过程,这样有利于我们加深对程序运行的理解。
用户11029129
2024/06/04
4370
宏(预编译)详解
【C语言篇】编译和链接以及预处理介绍(上篇)
本篇博客只是针对上层应用对编译链接过程进行一个笼统的介绍,让C语言初学者对于编译和链接有一个基本的印象轮廓,具体的内容学校计算机专业会有专门这样一节课,需要学的东西还是很多的哈😘
半截诗
2024/10/09
2310
【C语言篇】编译和链接以及预处理介绍(上篇)
makefile从入门到放弃——博主吐血整理的笔记
在没有编写makefile之前可以使用命令gcc *.c -Wall查看当前代码是否有语法错误。检查没有语法错误以后可以编写makefile文件。
全栈程序员站长
2022/09/05
1.9K0
Linux从入门到精通(九)——Linux编程
vi的工作是在文本缓冲区中实现的,为了帮助用户观看, 可为文本的行设置一个行号, 放在文本的左侧(行首前) 可以用末行命令set来设置和取消:
传说之下的花儿
2023/04/16
2.3K0
Linux从入门到精通(九)——Linux编程
C编译: makefile基础
在编译一个大型项目的时候,往往有很多目标文件、库文件、头文件以及最终的可执行文件。不同的文件之间存在依赖关系(dependency)。比如当我们使用下面命令编译时: $gcc -c -o test.o
Vamei
2018/01/18
1.3K0
C编译: makefile基础
C/C++:程序环境和预处理/宏
在ANSI C的任何一种实现中,存在两个不同的环境。第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。第2种是执行环境,它用于实际执行代码。
二肥是只大懒蓝猫
2023/03/30
7390
C/C++:程序环境和预处理/宏
C语言进阶(十五) - 预处理与程序编译初步解析
本节主要介绍程序运行前的预处理(预编译)阶段的相关知识。同时简单介绍一个程序是如何从一行行代码到开始运行并得到结果的。
怠惰的未禾
2023/04/27
5400
C语言进阶(十五) - 预处理与程序编译初步解析
gcc命令大全
使用gcc编译器时,必须给出一系列必要的调用参数和文件名称。不同参数的先后顺序对执行结果没有影响,只有在使用同类参数时的先后顺序才需要考虑。如果使用了多个 -L 的参数来定义库目录,gcc会根据多个 -L 参数的先后顺序来执行相应的库目录。
全栈程序员站长
2022/11/04
2K0
DM8168 GPIO驱动与測试程序
交叉编译測试程序:arm-none-linux-gnueabi-gcc -o gpio_test gpio_test.c
全栈程序员站长
2022/07/12
4930
程序环境和预处理
在ANSI C的任何一种实现中,存在两个不同的环境 第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。 第2种是执行环境,它用于实际执行代码。
绝活蛋炒饭
2024/12/16
2080
程序环境和预处理
【C】程序环境和预处理
相关指令gcc -S test.c 编译完成之后就停下来,结果保存在test.s中。
阿伟@t
2023/10/10
2720
【C】程序环境和预处理
makefile 的 ifdef, ifeq 使用及辨析
#可以用命令行传递变量 RELEASE = abc #ifdef 变量名称不能加$() ifdef RELEASE $(warning RELEASE defined) else $(warning RELEASE not defined) endif #ifeq 后面参数要叫$(), 因为是值引用, 值可以为数值或字符串 ifeq ($(RELEASE),abc) $(warning RELEASE eqal abc) else $(warning RELEASE not equal abc) endif all: @echo ok! ************************************************** make 编译不同版本,例如debug, release 的简单示例。 用make 变量ver, 控制CFLAGS 变量,从而编译出不同版本。 [/pts/2@hjj ~/test]$ cat test.c #include <stdio.h> #include <unistd.h> int main(int argc,char *argv[]) { char *tty=ttyname(0); printf("tty is %s\n",tty); return 0; } [/pts/2@hjj ~/test]$ cat Makefile CC = gcc TARGET = test OBJS = test.o ifeq ($(ver), debug) $(warning ver is debug) CFLAGS = -g -Ddebug else $(warning ver is not debug) CFLAGS = -c -O3 endif $(TARGET): $(OBJS) $(CC) -o $@ $^ clean: rm test test.o 注释: makefile 采用了ifeq-else-endif 结构 可以判别莫个make变量是否定义。 make变量可以在makefile中定义,也可以由make命令行传递。 由于makefile 支持环境变量,所以你预先定义了环境变量,也可以不在命令行中传递而直接使用环境变量 这种机制使得编写脚本控制不同的复杂的编译成为可能, 例如支持各种地域的不同的版本。用地域变量,控制make的编译选项/D,控制编译出不同的版本 ---------------------------------------- 编译debug 版本, 从命令行传递变量 ---------------------------------------- [/pts/2@hjj ~/test]$ make ver=debug Makefile:6: ver is debug gcc -g -Ddebug -c -o test.o test.c gcc -o test test.o ---------------------------------------- 清理,无所谓版本信息 ---------------------------------------- [/pts/2@hjj ~/test]$ make clean Makefile:9: ver is not debug rm test test.o ---------------------------------------- 编译release 版本 ---------------------------------------- [/pts/2@hjj ~/test]$ make Makefile:9: ver is not debug gcc -c -O3 -c -o test.o test.c gcc -o test test.o
战神伽罗
2019/07/24
8.4K1
深入浅出GCC编译器
GCC原名为GNU C语言编译器(GNU C Compiler),只能对C语言进行编译等处理。后来随着其功能的扩展,可以支持更多编程语言,如C++、Java、Fortran、Pascal、Objective -C、Ada、Go以及各类处理器架构上的汇编语言等。所以,现在我们所说的GCC是指GNU编译器套件(GNU Compiler Collection)。本文将带你迈入GCC的大门,了解一个C源文件是如何在GCC编译工具链的加工下成为一个可执行性文件的,并详细讲解GCC编译参数以及可能会用到的其他知识。
mindtechnist
2024/08/08
1.1K0
深入浅出GCC编译器
Makefile 使用总结
http://www.cnblogs.com/wang_yb/p/3990952.html
bear_fish
2018/09/20
3.9K0
【C语言】程序环境和预编译
任何一个C语言程序在执行时,都会存在两个不同的环境。 第一个是翻译环境:在这个环境中C程序的源代码会被转换为可执行的机器指令(二进制指令) 第二个是执行环境:它用于实际执行代码
举杯邀明月
2023/04/12
8260
【C语言】程序环境和预编译
【嵌入式】C语言程序调试和宏使用的技巧
在Linux使用gcc编译程序的时候,对于调试的语句还具有一些特殊的语法。gcc编译的过程中,会生成一些宏,可以使用这些宏分别打印当前源文件的信息,主要内容是当前的文件、当前运行的函数和当前的程序行。
混说Linux
2022/07/14
8100
动态链接库使用举例
6.验证下so是不是动态加载的,只需要修改print.c中打印,改成printf("msg=%s/n", msg);,然后执行make -f makefile.lib,再执行./main, 会显示结果如下
王亚昌
2018/08/03
2.5K0
相关推荐
GCC与MinGW的简单安装与使用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验