1993年C代码中断函数指针编译报错原因及修复咨询
错误原因分析
1993年的程序大概率是用Turbo C这类DOS时代的编译器编写的,这类编译器支持非标准的interrupt关键字——用来标记函数指针指向中断服务程序(ISR),编译器会生成符合中断调用约定的代码(比如自动保存所有寄存器、用iret指令返回等)。
而你现在使用的MinGW基于GCC,遵循现代C标准(C99及以后),完全不支持这个非标准关键字,因此编译时会报错expected declaration specifiers or '...' before '*' token——编译器无法识别interrupt,会认为函数指针声明的语法不合法。
修复方法
根据你的需求场景,有两种修复方案:
场景1:仅需通过编译,无需实际处理硬件中断
如果程序只是做功能模拟,不需要真的调用中断服务,可以直接将interrupt关键字忽略:
- 在代码开头添加宏定义,将
interrupt替换为空:#define interrupt - 同时把旧式无原型的函数指针
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
相关产品推荐
相关产品推荐

