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

1993年C代码中断函数指针编译报错原因及修复咨询

错误原因分析

1993年的程序大概率是用Turbo C这类DOS时代的编译器编写的,这类编译器支持非标准的interrupt关键字——用来标记函数指针指向中断服务程序(ISR),编译器会生成符合中断调用约定的代码(比如自动保存所有寄存器、用iret指令返回等)。

而你现在使用的MinGW基于GCC,遵循现代C标准(C99及以后),完全不支持这个非标准关键字,因此编译时会报错expected declaration specifiers or '...' before '*' token——编译器无法识别interrupt,会认为函数指针声明的语法不合法。


修复方法

根据你的需求场景,有两种修复方案:

场景1:仅需通过编译,无需实际处理硬件中断

如果程序只是做功能模拟,不需要真的调用中断服务,可以直接将interrupt关键字忽略:

  1. 在代码开头添加宏定义,将interrupt替换为空:
    #define interrupt
    
  2. 同时把旧式无原型的函数指针void (*OldIntrSrvc)();改为标准原型声明,消除编译警告:
    struct SERIALCOM {
        void interrupt (*IntrSrvc)(void);
        void interrupt (*OldIntrSrvc)(void);
    };
    

场景2:需要实际处理DOS环境下的硬件中断

如果要保留中断服务功能,需改用GCC的扩展属性替代interrupt关键字:

struct SERIALCOM {
    void (*IntrSrvc)(void) __attribute__((interrupt));
    void (*OldIntrSrvc)(void) __attribute__((interrupt));
};

注意:这种方式仅适用于编译DOS目标程序的GCC(比如DJGPP)。如果是用MinGW编译Windows程序,直接操作硬件中断是不被允许的——Windows保护模式下禁止用户态程序直接访问硬件和中断,此时你需要重写串口相关逻辑,改用Windows原生的串口API(如CreateFile、ReadFile)实现功能。


额外提示

老程序可能还存在其他DOS时代的非标准语法(比如far/near指针),遇到类似编译错误时,也可以用宏替换的方式处理,或者根据GCC的对应扩展属性调整代码。

内容的提问来源于stack exchange,提问作者slv026

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 02:16:04