Linux下C程序输出同名C文件源码 解决__FILE__宏重命名报错问题
问题解决方法
问题根源
你遇到的段错误和无法适配可执行文件改名的问题,来自两个核心错误:
__FILE__是编译期硬编码的常量,程序运行时不会动态变化,修改可执行文件名后无法匹配到新的源文件名。- 原有代码没有判断
fopen的返回值,当文件打开失败时fopen返回NULL,后续fgetc操作空指针直接触发段错误;同时你定义的c为char类型,fgetc返回值为int,EOF超出char取值范围会导致判断逻辑异常,且c未初始化就进行!= EOF判断属于未定义行为。
解决方案
通过main函数的argv[0]参数动态获取运行时的可执行文件名,提取文件名后拼接.c后缀构造目标源文件名,同时增加错误判断和符合标准的文件读写逻辑,完全满足-ansi -pedantic -Wall的编译要求。
完整代码
#include <stdio.h> #include <string.h> int main(int argc, char *argv[]) { char *exec_name; char src_name[256]; FILE *fp; int c; /* 提取可执行文件名,去掉路径前缀 */ exec_name = strrchr(argv[0], '/'); if (exec_name == NULL) { exec_name = argv[0]; } else { exec_name++; } /* 构造对应.c源文件名 */ sprintf(src_name, "%s.c", exec_name); /* 打开文件并判断是否成功 */ fp = fopen(src_name, "r"); if (fp == NULL) { perror("无法打开源文件"); return 1; } /* 读取并输出文件内容 */ while ((c = fgetc(fp)) != EOF) { putchar(c); } fclose(fp); return 0; }
编译运行验证
- 编译命令:
gcc -ansi -pedantic -Wall 你的源文件名.c -o 可执行文件名 - 改名测试:将编译生成的可执行文件和对应的
.c源文件修改为任意同名的新名称,直接运行新的可执行文件即可正常输出对应.c文件的内容。
补充说明:如果需要支持通过符号链接运行时读取原可执行文件对应的源文件,可以用Linux特有的
readlink读取/proc/self/exe获取真实可执行文件路径,该方案不符合ANSI C标准,可根据需求选择。
内容的提问来源于stack exchange,提问作者Nikman
相关产品推荐
相关产品推荐

