对部件的引用

本节描述一组规则,这些规则确定 EGL 如何标识名称所引用的部件。在下列情况下,这些规则非常重要:

第二组规则确定 EGL 如何解析变量引用。有关详细信息,请参阅对变量和常量的引用

基本可视性规则

最简单的情况是,您在一个包中一个接一个地定义部件,而不在一个部件中声明另一个部件。以下列表省略了许多详细信息,但显示了处于同一层次级别的一系列部件:

   Function:  Function01
   Function:  Function02
   Function:  Function03
   Record:    Record01

同一级别的各部件可以相互使用。例如,Function01 可以调用其它一个或两个函数;而 Record01 可以用作三个函数的每一个中的变量的 typedef。

在大多数情况下,一个部件不能嵌套另一个部件。例外情况如下所示:
  • 程序、库或 pageHandler 可以嵌套函数,但即便如此,包含也必须是直接的;一个函数不能嵌套另一个函数
  • 表单组可以嵌套表单
下面是一个具有被嵌套部件的示例:
   Program:  Program01
     Function:  Function01
     Function:  Function02
   Function:  Function03
   Record:    Record01
顶层部件可供包中的所有其它部件使用。但是,被嵌套部件(Function01 和 Function02)只能供包中的一部分部件使用:
  • 它们可以相互使用。
  • 它们可供嵌套部件以及嵌套部件在运行时使用的函数使用。例如,如果 Function01 调用 Function03,则由于在 Program01 中使用了 Function03,所以 Function03 可以调用 Function02。

最后,如果代码包含文本或打印表单,则需要使用声明才能访问包含那些表单的表单组。当访问数据表或库时,也需要使用声明。有关其它信息,请参阅使用声明

其它可视性规则

大多数开发工作会在多个包之间共享部件。下列规则有效:

部件名解析

要解析部件引用,EGL 执行搜索,此搜索包括一个到多个步骤。下列描述对于每个步骤都是适用的:
  • 如果找到具有唯一名称的部件,则搜索成功结束
  • 如果找到两个同名的部件,则搜索会由于错误而结束。
下列情况也是有可能的:
  • 用包名对部件引用进行限定;在这种情况下,搜索始终只包括一个步骤
  • 未用包名对部件引用进行限定,并且该部件引用不是函数调用
  • 未用包名对部件引用进行限定,并且该部件引用是函数调用
下列情况基本上是不重要的,但它们可能适用于最后两种情况的任何一种:
  • 引用函数中的属性 containerContextDependent 可能设置为 yes。通过设置该属性,可以扩展用来解析引用的名称空间,如 containerContextDependent 所述。
  • 如果其中一个函数对程序或页面处理程序可见,并且名称与 EGL 系统函数的名称完全相同,则引用该函数,而不是引用系统函数。

指定了包名时的部件名解析

如上所述,在引用部件时可以指定包名,如 my.package.myPart 的示例所示。将考虑当前项目,并考虑 EGL 构建路径中列示的任何项目。

如果该引用来自于同一个包中的部件,则下列描述是适用的:
  • 包名有效,但不是必需的
  • 即使部件被声明为 private,也会解析该部件名

未指定包名时的部件名解析(函数调用除外)

如果一个部件引用除函数以外的部件,并且未指定包名,则按搜索顺序执行的步骤如下所示:
  1. 搜索这样的部件:这个部件和引用该部件的部件嵌套在同一容器中。
  2. 搜索引用部件所在的文件中显式导入的部件。将考虑当前项目,并考虑 EGL 构建路径中列示的任何项目。

    在这种情况下,每个 import 语句都显式地引用特定包中的特定部件。这种显式类型 import 语句中命名的部件将覆盖当前包中的同名部件。

    如果在两个不同的项目中有名称完全相同的包,则给定的显式类型 import 语句将使用 EGL 构建路径来执行“最先找到”搜索,即,在找到必需部件时停止。(该部件对于给定项目中的包来说必须是唯一的。)在两个不同项目中存在同名的包并不是错误,但会造成混淆,因此不建议这么做。

    如果有两个指定同一部件的显式类型 import 语句,则会发生错误。

  3. 搜索与引用部件位于同一个包中的顶层部件。将考虑当前项目,并考虑 EGL 构建路径中列示的任何项目。查找两个同名的部件将导致错误。
  4. 搜索导入的其它部件。将考虑当前项目,并考虑 EGL 构建路径中列示的任何项目。

    在这种情况下,每个 import 语句都将引用给定包中的所有部件,这种语句称为通配 import 语句

    如果在两个不同的项目中有名称完全相同的包,则给定的通配 import 语句将使用 EGL 构建路径来执行“最先找到”搜索,即,在找到必需部件时停止。(该部件对于给定项目中的包来说必须是唯一的。)

    如果多个通配 import 语句检索同名的部件,则会发生错误。

未指定包名时的函数调用

如果一个部件调用函数,并且未指定包名,则按搜索顺序执行的步骤如下所示:
  1. 搜索这样的函数:它们和调用它们的程序嵌套在同一个容器中。
  2. 搜索位于容器的使用声明中指定的库中的函数。
  3. 仅对在生成时包括在容器中的函数继续进行搜索。(要包括除了那些嵌套在同一个容器中或者位于库中的函数以外的函数,请将容器属性 includeReferencedFunctions 设置为 yes。)
    对包括的函数执行的搜索是按以下方式进行的:
    1. 搜索容器所在的文件中显式导入的部件。将考虑当前项目,并考虑 EGL 构建路径中列示的任何项目。

      在这种情况下,每个 import 语句都显式地引用特定包中的特定部件。这种显式类型 import 语句中命名的部件将覆盖当前包中的同名部件。

      如果在两个不同的项目中有名称完全相同的包,则给定的显式类型 import 语句将使用 EGL 构建路径来执行“最先找到”搜索,即,在找到必需函数时停止。(该函数对于给定项目中的包来说必须是唯一的。)在两个不同项目中存在同名的包并不是错误,但会造成混淆,因此不建议这么做。

      如果有两个指定同一部件的显式类型 import 语句,则会发生错误。

    2. 搜索与容器位于同一个包中的顶层函数。将考虑当前项目,并考虑 EGL 构建路径中列示的任何项目。如果搜索找到两个同名的部件,则会发生错误。
    3. 搜索导入的其它部件。将考虑当前项目,并考虑 EGL 构建路径中列示的任何项目。

      在这种情况下,每个 import 语句都将引用给定包中的所有部件,这种语句称为通配 import 语句

      如果在两个不同的项目中有名称完全相同的包,则给定的通配 import 语句将使用 EGL 构建路径来执行“最先找到”搜索,即,在找到必需部件时停止。(该部件对于给定项目中的包来说必须是唯一的。)

      如果多个通配 import 语句检索同名的部件,则会发生错误。

程序调用

当在 call 语句或 transfer 语句上调用程序时,调用程序的自变量列表必须与被调用程序的参数列表匹配。自变量和参数不匹配将导致错误。

使用条款 | 反馈
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.