在 Cobol 中获取当前行号

3

在 Cobol 程序中,是否可以获得并显示当前行号?例如,在 C 语言中可以通过以下方式实现:

...
printf("Current line = %d\n", __LINE__);
...
2个回答

3

简短回答:不行。

详细回答:COBOL 2002年版增加了用于异常处理的内置函数。使用这些函数,您可以获取最后出错发生的位置和激活的检查项。您可以通过引发非致命异常并在同一行中理想地使用该函数来实现某些功能……根据标准:

EXCEPTION-LOCATION 函数返回一个字母数字字符字符串,其中一部分是与上一个异常状态相关联的语句的实现定义位置。

因此,这可能为您提供号,因为返回值取决于实现,而且目前还没有IBM、MicroFocus或Fujitsu编译器支持该内置函数。GnuCOBOL实现会返回一个带有分号分隔的列表,其中最后一条记录是行号。 即将发布的COBOL标准增加了 MODULE-NAME 内置函数 - 但是这只提供了名称,没有提供行引用。

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

如果意图是进行某种跟踪:许多编译器都有扩展 READY TRACE/ RESET TRACE。使用这两个语句(以及可能的编译器指令/选项),它们至少会显示到达的节和段的名称,某些情况下还会显示行号。通常可以将其重定向到文件中;否则将转到默认错误流。
如果您使用 GnuCOBOL 并使用 -ftrace-all 编译,则也可以使用该功能进行行或语句跟踪,并按照 COB_TRACE_FORMAT 中指定的自定义格式进行格式化输出(此格式也可以在 COBOL 程序中进行调整并限制为行号)。


1

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

COBOL 85通过DEBUG模块提供了这一功能。该功能在COBOL 85中已被废弃,并在COBOL 2002中被删除。虽然2002标准中仍有DEBUG行,但DEBUG模块已从标准中删除。

注意:DEBUG模块可能仍可用于当前编译器。

此功能需要在段落中启用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)。如果没有开关参数,行号将不会显示。(对于GnuCOBOL 3.2,显然是环境变量COB_SET_DEBUG,值为'Y','y'或'1'。;-))

命令行:

dbug (+D)

显示:
Before
Source-line:     17
After

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接