我主要是一名C开发人员,而不是一名普通的COBOL开发人员。我希望我的COBOL程序在IBM-I上具有与在z/OS上相同的源代码。
我的COBOL程序调用一个子例程。在z/OS上,我这样调用:
CALL
'PBFNInit' USING
BY VALUE NULL-POINTER,
在IBM上,我必须这样称呼:
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==
。
在源中。
如果所有的调用都应该是过程调用,那么您似乎可以通过compile或process选项上的参数为所有调用设置这一点。
https://www.ibm.com/docs/en/i/7.4?topic=program-识别被称为程序过程的链接类型
上面写着
CRTCBLMOD和CRTBNDCBL命令的LINKLIT参数,或关联的PROCESS语句选项。
CRTCBLMOD和CRTBNDCBL命令的LINKLIT参数允许您可以在编译时指定所有外部的链接类型CALL文字-1、CANCEL文字-1或SET过程指针数据项ILE COBOL程序中的TO ENTRY literal-1语句。你没有需要在SPECIAL-NAMES段落中指定LINKAGE TYPE子句或带有CALL、CANCEL或SET…ENTRY的LINKAGE TYPE短语当链接已由LINKLIT参数定义时的语句CRTCBLMOD或CRTBNDCBL。
我不使用这些编译器,也不开发基础设施SPL,但如果必须的话,因为PROCEDURE这个词是IBMi上编译器的唯一区别,我会像这个一样
-
当然,正如piet所说。2022年4月1日
DEFINE(IBM-I(作为编译选项,并添加>gt;将IBM-I定义为COBOL源中的PARAMETER
-
在您的cobol源中,只需确保在需要时添加PROCEDURE单词
CALL >>IF IBM-I DEFINED PROCEDURE >>END-IF 'PBFNInit' USING BY VALUE NULL-POINTER, [...]