我主要是一名 C 开发人员,而不是普通的 COBOL 开发人员。我希望我的 COBOL 程序在 IBM-i 上具有与 z/OS 上相同的源。
我的 COBOL 程序调用子例程。在 z/OS 上我这样调用:
CALL
'PBFNInit' USING
BY VALUE NULL-POINTER,
在 IBM i 上我必须这样调用:
CALL PROCEDURE
'PBFNInit' USING
BY VALUE NULL-POINTER,
有什么方法可以动态告诉 COBOL 编译器使用哪种格式的 CALL 语句?
我希望有某种动态语句,比如由此控制的调试语句
SOURCE-COMPUTER. IBM-3270 WITH DEBUGGING MODE.
如果您的编译器支持条件编译,您可以使用编译器指令定义一个常量,然后...
>>EVALUATE TRUE
>>WHEN DEFINED IBM-Z
CALL 'PBFNInit' USING
BY VALUE NULL-POINTER, [...]
>>WHEN DEFINED IBM-I
CALL PROCEDURE 'PBFNInit' USING
BY VALUE NULL-POINTER, [...]
>>WHEN OTHER
!non-sequiter, your facts do not coordinate
>>END-EVALUATE
每条评论更新 1...
您可以尝试将此答案与@SimonSobisch 的答案结合起来,例如......
>>IF DEFINED IBM-I
REPLACE ==CALL== BY ==CALL PROCEDURE==.
>>END-IF
CALL 'PBFNInit' USING
BY VALUE NULL-POINTER, [...]
当前文档中没有任何内容表明正在条件编译的文本必须是有效的代码。也许作者认为这是隐含的,或者也许这是一个错误。
WITH DEBUGGING MODE
将是每个文件中的一个微小更改 - 但也与实际的 COBOL 功能重叠。
如果“小改动”适合您,那么只需编码
CALL PROCEDURE
并使用单个
REPLACE ==CALL PROCEDURE== BY ==CALL==
.
在源代码中。
如果所有调用都应该是过程调用,那么看起来您可以使用编译参数或进程选项为所有调用设置此值。
https://www.ibm.com/docs/en/i/7.4?topic=program-identifying-linkage-type- Called-programs-procedures
它说
CRTCBLMOD 和 CRTBNDCBL 命令的 LINKLIT 参数,或 关联的 PROCESS 语句选项。
CRTCBLMOD 和 CRTBNDCBL 命令的 LINKLIT 参数允许 您可以在编译时指定所有外部的链接类型 CALL 文字-1、取消文字-1 或 SET 过程指针数据项 ILE COBOL 程序中的 TO ENTRY Literal-1 语句。你不 需要在 SPECIAL-NAMES 段落中指定 LINKAGE TYPE 子句 或带有 CALL、CANCEL 或 SET…ENTRY 的 LINKAGE TYPE 短语 当链接已由 LINKLIT 参数定义时的语句 CRTCBLMOD 或 CRTBNDCBL。
我不使用这些编译器,也不开发基础设施 SPL,但如果我必须这样做,因为 PROCEDURE 这个词是 IBM i 上编译器的唯一区别,我会这样做
当然正如piet.t所说,2022年4月1日
在 IBM i 上编译时将 DEFINE(IBM-I) 作为编译选项,并在 COBOL 源代码中添加 >>DEFINE IBM-I AS PARAMETER(在开头)
在您的 cobol 源中,请务必在需要时添加 PROCEDURE 一词
CALL
>>IF IBM-I DEFINED
PROCEDURE
>>END-IF
'PBFNInit' USING
BY VALUE NULL-POINTER, [...]