在 Cobol 中获取当前行号

Getting current line number in Cobol

是否可以在Cobol程序中获取并显示当前行号? 例如,C 允许通过以下方式进行:

...
printf("Current line = %d\n", __LINE__);
...

简答:否
没有可移植的 COBOL 方法可以做到这一点,尤其是在 __LINE__ 那样的所有地方。

带有潜在替代方案的长答案
COBOL 2002 添加了用于异常处理的内部函数。使用这些你可以得到最后一个错误发生的位置,激活了哪些检查。
可以 通过引发非致命异常来破解某些东西,理想情况下在同一行中使用该函数...... 从标准:

The EXCEPTION-LOCATION function returns an alphanumeric character string, part of which is the implementor-defined location of the statement associated with the last exception status.

所以这个 可能 为您提供 号码,因为返回值取决于实现,另外似乎 - 在在撰写本文时——IBM、MicroFocus 或 Fujitsu 编译器根本不支持该内在函数。 GnuCOBOL 实现 returns 以分号分隔的列表,最后一个条目是行号。

即将推出的 COBOL 标准添加了 MODULE-NAME 内部函数 - 但这只会给出名称,而不是行引用。

如果您可以自由选择使用哪种实现,那么在 GnuCOBOL 中添加一个额外的寄存器 COB_SOURCE_LINE / COB_SOURCE_FILE 应该相对容易添加...

如果打算进行某种跟踪:许多编译器都有扩展名 READY TRACE/ RESET TRACE。使用这两个语句(可能还有编译器指令/选项),它们至少会显示到达的部分和段落的名称,有些还可能显示行号。通常这可以重定向到一个文件,否则将转到默认错误流。
如果您使用 GnuCOBOL 并使用 -ftrace-all 进行编译,您还可以使用它来使用 COB_TRACE_FORMAT 中指定的自定义格式的行或语句跟踪 [也可以在 COBOL 程序中进行调整并限制为行数].

问: 在Cobol程序中是否可以获取并显示当前行号?

COBOL 85 中有一个称为 DEBUG 模块的功能。该功能在 COBOL 85 中已过时,随后在 COBOL 2002 中被删除。虽然 DEBUG 行在 2002 标准中可用,但 DEBUG 模块已从标准中删除。

注意:DEBUG 模块在当前的编译器中可能仍然可用。

该功能需要在 source-computer 段中使用 debugging mode。如果删除该行,第 7 列中带有 Dd 的源代码行将被视为注释。

必须添加声明才能访问 debug-line,这是源代码行号的标准名称。

我对源代码进行了编码,以便显示我放置 perform show-line 的任何地方的源代码行号。请注意 show-line 没有做任何事情。

来源:

   program-id. dbug.
   environment division.
   source-computer. computer-name debugging mode.
   object-computer. computer-name.
   data division.
   working-storage section.
   01 char pic x.
   procedure division.
   declaratives.
  ddebug section.
  duse for debugging show-line.
  d    display "Source-line: " debug-line.
   end declaratives.
   main-line.
   begin.
       display "Before"
  d    perform show-line
       display "After"
       accept char
       stop run.

  dshow-line.

   end program dbug.

每个实施者都有自己激活该功能的方法。对于我使用的系统,它是命令行上的一个开关参数(+D)。如果没有 switch 参数,行号将不会显示。 (对于 GnuCOBOL 3.2,显然,环境变量 COB_SET_DEBUG 的值为 'Y'、'y' 或 '1'。;-)

命令行:

dbug (+D)

显示:

Before
Source-line:     17
After