Kun*_*oy 1 rpg rpgle ibm-midrange
我有一个程序 SS150R,其中 PI 声明为
Dcl-pi SS150R;
pCompcd Char(4);
ptrncd Packed(3:0);
pErrMsg Char(30) options(*nopass);
pSuccess Char(1) options(*nopass);
End-pi;
Run Code Online (Sandbox Code Playgroud)
没有为此(PI)声明原型(PR),但该程序仍然运行良好。
我的问题是,我一直读到,如果有一个命名的 PI ,如果它不是一个命名的 PI ,则必须声明原型
dcl-pi *n ;
Parm char(1) ;
end-pi ;
Run Code Online (Sandbox Code Playgroud)
那么就不需要原型声明了。有人可以解释一下,如果我的程序 SS150R 有一个指定的 PI 并且没有 PR,但它如何仍然有效?
注意:我的程序被旧的非RPG程序调用。
首先,原型仅由编译器用来定义CALLP操作码的参数。但编译器足够智能(自 v7.1 起),如果过程是在与 相同的源中定义的CALLP,它可以从过程接口获取参数定义。原型不是运行时对象,因此一旦编译成功,就不会影响程序的运行。
实际上,仅当过程或程序由外部程序或使用 的过程调用时才需要原型CALLP。EXPORT但我通常会为所有ed 程序和过程创建原型,MAIN因为我可能想从其他 RPGLE 程序或过程中调用它们,而我CALLP最近才使用。
所以这里有各种场景:
重申一下,如果我在模块中定义一个过程,并且该过程是用 EXPORT 声明的,那么我总是创建一个原型。此外,我总是为所有程序主程序声明一个原型。这些原型总是在副本中定义,因此相同的原型可以在任何潜在的调用程序或过程中使用。这些天我只使用CALLPRPGLE 调用过程或程序,并且操作代码始终是隐式的。
没有定义的过程EXPORT不需要原型,所以我不对它们进行编码。
注意:CALL并且CALLB必须始终明确包含在内,我不再使用其中任何一个。