IBM i 和 z/OS 的单一来源
Single source for IBM i and z/OS
我主要是 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.
如果您的编译器支持 conditional compilation, you could define a constant 和编译器指令,那么...
>>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
它说
the LINKLIT parameter of the CRTCBLMOD and CRTBNDCBL commands, or the
associated PROCESS statement option.
The LINKLIT parameter of the CRTCBLMOD and CRTBNDCBL commands allows
you to specify, at compile time, the linkage type for all external
CALL literal-1, CANCEL literal-1, or SET procedure-pointer-data-item
TO ENTRY literal-1 statements in the ILE COBOL program. You do not
need to specify the LINKAGE TYPE clause in the SPECIAL-NAMES paragraph
or the LINKAGE TYPE phrase with the CALL, CANCEL, or SET…ENTRY
statement when the linkage has been defined by the LINKLIT parameter
of CRTCBLMOD or CRTBNDCBL.
我主要是 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.
如果您的编译器支持 conditional compilation, you could define a constant 和编译器指令,那么...
>>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
它说
the LINKLIT parameter of the CRTCBLMOD and CRTBNDCBL commands, or the associated PROCESS statement option.
The LINKLIT parameter of the CRTCBLMOD and CRTBNDCBL commands allows you to specify, at compile time, the linkage type for all external CALL literal-1, CANCEL literal-1, or SET procedure-pointer-data-item TO ENTRY literal-1 statements in the ILE COBOL program. You do not need to specify the LINKAGE TYPE clause in the SPECIAL-NAMES paragraph or the LINKAGE TYPE phrase with the CALL, CANCEL, or SET…ENTRY statement when the linkage has been defined by the LINKLIT parameter of CRTCBLMOD or CRTBNDCBL.