带命名PI的RPGLE程序未声明原型仍运行,求解释
问题解答
首先得明确RPGLE里程序接口(PI)和原型(PR)的核心作用差异:
- PR(原型)是给调用方用的,用来让编译器校验调用时的参数格式、顺序、可选属性是否正确,只有当调用方是RPG程序且用原型式调用(比如
CALLP或直接用程序名调用)时才需要。 - **PI(程序接口)**是给被调用程序自身用的,不管是命名还是无名,本质都是定义本程序要接收的参数结构,和调用方是否用原型无关。
你的SS150R程序能正常运行的原因如下:
- 你的程序是被旧的非RPG程序调用,这些调用方根本不依赖RPG的原型机制,它们用的是传统的调用方式(比如CL的
CALL命令),直接按位置传递参数,不需要PR来做参数校验。 - 所谓“命名PI必须声明PR”的说法是有前提的:只有当这个RPG程序被其他RPG程序用原型方式调用时,才需要在调用方定义同名PR,同时被调用方用命名PI来匹配。如果是被非RPG程序调用,或者用传统
CALL调用,不管PI是命名还是无名,都不需要PR。
你的命名PI代码:
Dcl-pi SS150R; pCompcd Char(4); ptrncd Packed(3:0); pErrMsg Char(30) options(*nopass); pSuccess Char(1) options(*nopass); End-pi;
它在这里的作用和无名PI完全一样——只是告诉编译器本程序的入口参数是什么,因为调用方不依赖PR,所以没有PR也能正常接收参数运行。
内容的提问来源于stack exchange,提问作者Kunal Roy
相关产品推荐
相关产品推荐

