You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 02:54:04