PROGRESS 4GL:修改.i文件后是否需编译.p文件?
.i文件更新后要不要重新编译依赖它的.p文件?
直接给结论
- 如果你的.i文件只是改改注释、调调格式(比如加换行、缩缩进),完全没碰接口、宏、数据结构这些编译时要用到的东西,那不用重新编译.p文件,直接把新的.i文件丢到对应目录就行。
- 但要是改了哪怕一点点编译期相关的内容——比如宏的值、结构体字段、函数参数类型,哪怕你觉得当前程序跑起来没事——也必须重新编译依赖的.p文件,不然迟早要踩坑。
具体说清楚
先搞懂.i和.p的关系
.i文件一般是接口头文件,给.p这类实现文件提供编译时需要的信息:比如函数长啥样、结构体有哪些字段、宏定义的值是什么。编译.p的时候,编译器会读取对应的.i文件来生成正确的目标代码。
不用编译的情况:纯“表面修改”
只有当你的修改完全不影响编译器解析的内容时,才可以偷懒:
- 给代码加注释、改注释内容
- 调整代码格式,比如把一行拆成两行,或者把缩进从4空格改成2空格
- 删除没用的空行或者旧注释
这些改动对编译器来说等于没改,所以.p的编译产物不会有问题,直接替换.i文件就ok。
必须编译的情况:碰了“编译期依赖”
别觉得“我改的东西当前程序用不到就没事”,只要改了编译器会读的内容,哪怕现在没影响,后续绝对会出问题:
- 改了宏定义的值,比如
#define LIMIT 50改成#define LIMIT 100,哪怕当前.p里没用到这个宏 - 给结构体加了个字段、删了个字段,或者改了字段类型
- 改了函数的参数类型、返回值类型,哪怕函数实现没动
- 给.i文件加了新的头文件引用
这些改动会让编译器对.p的编译逻辑产生变化,现在不重新编译,以后别的模块调用或者扩展功能时,大概率会出现类型不匹配、符号错误之类的问题。
最后提个醒
别凭自己的判断觉得“不影响运行”就跳过编译,很多隐性bug都是这么来的——比如你改了结构体,当前程序没用到新字段,但后续加了序列化逻辑,直接就炸了。拿不准的话,就老老实实重新编译所有依赖这个.i文件的.p文件,省得后面排查半天。
内容的提问来源于stack exchange,提问作者Bharat
相关产品推荐
相关产品推荐

