Ibm midrange 如何为RPG或CL程序中的激活组设置编译器选项?

Ibm midrange 如何为RPG或CL程序中的激活组设置编译器选项?,ibm-midrange,compiler-flags,rpgle,rpg,compiler-options,Ibm Midrange,Compiler Flags,Rpgle,Rpg,Compiler Options,是否有办法指定程序源,在编译期间应使用激活组的哪些选项 在as/400上的大多数程序中,我们需要更改激活组的处理方式(因为默认行为根本没有用处…)。每次我编译其中一个程序时,我必须记住设置编译器选项(在PDM中:输入14,点击F4,将DFTACTGRP从*是更改为*否,点击enter,将ACTGRP更改为*新建或*调用方,具体取决于程序)。因此,我们有很多在开始时带有注释的程序,有很多感叹号,提醒程序员这样做。是的,有时候你会忘记 有什么诀窍可以让你不必记住自己吗?你可以在你的RPLE或CLLE

是否有办法指定程序源,在编译期间应使用激活组的哪些选项

在as/400上的大多数程序中,我们需要更改激活组的处理方式(因为默认行为根本没有用处…)。每次我编译其中一个程序时,我必须记住设置编译器选项(在PDM中:输入
14
,点击
F4
,将
DFTACTGRP
*是
更改为
*否
,点击
enter
,将
ACTGRP
更改为
*新建
*调用方
,具体取决于程序)。因此,我们有很多在开始时带有注释的程序,有很多感叹号,提醒程序员这样做。是的,有时候你会忘记


有什么诀窍可以让你不必记住自己吗?

你可以在你的RPLE或CLLE程序源中设置这些编译器选项

RPG中,您可以在源代码顶部使用H-spec来设置编译器选项。像这样:

HDFTACTGRP(*NO) ACTGRP(*CALLER)
只需将其添加到您的其他内容中,例如:

H DEBUG DATEDIT(*YMD)
H DFTACTGRP(*NO) ACTGRP(*CALLER)
H BNDDIR('SRVBNDDIR')
H MAIN(main)
F OUTPUT   O    F 3000        DISK    USROPN
D ...
 * procedures, etc.
CL中,有一个特殊的命令
DCLPRCOPT
,它实际上不是一个命令(因为它不是在运行时执行的),而是一种设置编译器选项的方法

DCLPRCOPT DFTACTGRP(*NO) ACTGRP(*CALLER)
把它放在程序的最上面。我通常把它放在变量声明之后,任何实际命令之前。我还添加了一条简短的评论,因为我不认为可能对我的代码进行修改的每个人都会理解在那里做了什么:

PGM        PARM(&SOMEPARM)
DCL        VAR(&SOMEPARM) TYPE(*CHAR) LEN(*64)
DCL        VAR(&COUNTER) TYPE(*DEC) LEN(5 0) 

/* Setting options for compilation of this program */
/* This is a permanent job, so we want a *NEW activation group. */
DCLPRCOPT DFTACTGRP(*NO) ACTGRP(*NEW)

/* do actual work here in a loop */
/* ..... */

ENDPGM

现在,当您编译程序时(只需在PDM中输入
14
,然后按enter键),它将以您在源代码中指定的激活组行为结束。没有留下任何记忆。

除了@kratenko建议之外的另一种方法。如果您有默认的公司设置,您可以使用
CHGCMDDFT
更改命令默认值。e、 g.
CHGCMDDFT CRTBNDRPG'dfactgrp(*NO)
等等。。我们的做法是始终将设置设置设置为H-spec,特别是对于一些特殊的非标准设置。如果有人忘记了,将使用默认的公司设置。这种方法的一个问题是,更新后的命令可能会在操作系统更新后重置。您可以使用两种方法中的一种

  • 将所有CHGCMDDFT放入CL代码中,并在每次操作系统升级后重新运行
  • 将CHGCMDDFT必需的命令复制到库中,并将此库放入系统库列表中
  • 我们更改了很多其他默认命令,我更喜欢上面的方法1。
    希望这有帮助

    H规范在99%的程序中肯定是前进的方向,但偶尔你会发现一个编译器选项无法在H规范中设置。我过去使用过源代码控制软件,它在源代码标题中添加这些选项作为注释,并在编译时自动应用。为了解决在不同机器上编译的问题,我们编写了自己的编译实用程序,可以读取这些注释。这是一个相当简单的CL程序,你只需要决定评论的格式。

    我们实际上是为RPG设计的,但我花了很多年才找到CL的解决方案,而且很难在互联网上找到,所以我想我只需将其发布在这里(因此永远不要忘记我自己)。还可以使用一套标准的H规范,将它们放入一个单独的源成员(比如说,QRPGLESRC中的STDHSPEC),然后在您的程序中,只需发出一个h/copy QRPGLESRC,STDHSPEC,这样您就不需要记住每个“标准”选项;它们都在一个地方。您可能有一组成员,这些成员应该被编译到不同的激活组中,因此您可以为每个命名的激活组创建这样一个副本,使用适合您的成员的副本。DCLPRCOPT是与OS/400的CL编译器的V5R4M0一起添加的。如果您使用的是以前的操作系统版本(或者如果您在以前的版本中使用TGTRLS()),尝试使用DCLPRCOPT将获得CPD0030(命令DCLPRCOPT in library*LIBL not found。)@BuckCalabro您当然是对的,但是由于我们有一些
    *新的
    和一些
    *调用者
    程序,我认为对于我们来说,最好直接在代码中编写它(将一个H规范更改为一个/副本规范,这会更清楚),因为已经三个月了,没有什么新的东西出现,我将执行我自己的解决方案…升级是一个问题,对吗。我们不需要每个程序都有相同的值,所以它不起作用。而且:我们的系统已经超过20年了(我知道ILE并没有那么老——只有19年…)。我们不敢在全球范围内改变这样的值,我们有成百上千的现有程序。如果没有H-spec,当然。否则,我将避免添加额外的语法和您可能忘记使用的其他工具。但我怀疑,这也是你的观点。是的,当然,尽量使用h型眼镜。