原型未在名为 RPGLE 的程序中使用,但该程序仍然有效

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程序调用。

jma*_*phy 7

首先,原型仅由编译器用来定义CALLP操作码的参数。但编译器足够智能(自 v7.1 起),如果过程是在与 相同的源中定义的CALLP,它可以从过程接口获取参数定义。原型不是运行时对象,因此一旦编译成功,就不会影响程序的运行。

实际上,仅当过程或程序由外部程序或使用 的过程调用时才需要原型CALLPEXPORT但我通常会为所有ed 程序和过程创建原型,MAIN因为我可能想从其他 RPGLE 程序或过程中调用它们,而我CALLP最近才使用。

所以这里有各种场景:

  • 由同一源中的另一个过程调用的过程 - 不需要原型。
  • 由另一个过程或程序调用的过程或程序(不是 RPGLE)- 不需要原型。
  • OPM 程序调用的程序 - 不需要原型(不推荐)
  • 由另一个过程或程序调用的过程或程序(不使用 CALLP) - 不需要原型(不推荐)
  • 由另一个过程或程序使用 CALLP 调用的过程或程序 - 需要原型。

重申一下,如果我在模块中定义一个过程,并且该过程是用 EXPORT 声明的,那么我总是创建一个原型。此外,我总是为所有程序主程序声明一个原型。这些原型总是在副本中定义,因此相同的原型可以在任何潜在的调用程序或过程中使用。这些天我只使用CALLPRPGLE 调用过程或程序,并且操作代码始终是隐式的。

没有定义的过程EXPORT不需要原型,所以我不对它们进行编码。

注意:CALL并且CALLB必须始终明确包含在内,我不再使用其中任何一个。