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.