GDL 宏参数

宏定义的内容可以引用其所有、部分或不引用其形参,尤其是对于值宏定义,其中多个值宏定义可以在一个 *宏构造中出现,其中包含由所有定义共享的单个形参列表。 在这种情况下,一个定义可以引用一些形参,而另一个定义可以引用任何形参。

如果宏定义省略了对一个或多个形参的引用,则引用宏时提供的参数列表可以通过逗号 (,) 来指示这些缺失的参数,不分隔任何参数。

例如,以下宏引用仅使用第五个参数。 省略前四个。

*Attribute: =Macro(,,,, =PassedInMacroRef)

根本不需要指示尾随省略的参数。 如果上一示例中的宏声明了 10 个形参,但只引用了第五个参数,则前面的示例仍然是引用该宏的有效方法。

对于值宏,宏引用及其参数列表之间不允许有空格。 此语法使分析程序能够区分不使用任何参数的宏引用,而后跟类似于参数列表的宏引用和使用参数列表的宏引用。

例如,请考虑以下代码示例。

*Attrib:   =Macro1 (=Macro2)       *%  is 2 separate macro references
    while
*Attrib:   =Macro1(=Macro2)        *% you are passing Macro2 as a 
    *%  parameter  to Macro1.

如果宏定义是嵌套的,则正式参数只能由声明参数的宏的内容使用。 嵌套宏定义的内容不能引用封闭宏定义的参数。

宏定义中出现的宏引用可以包含参数列表,这些参数列表可以命名自身需要参数列表的宏。 但是,不能为对形参的引用提供参数列表。 例如,块宏定义中的以下条目是可接受的。

*Attrib1: =Macro1(=Macro2(=Macro3(=Arg1, =Arg2)))

在前面的示例中,=MacroN 表示对以前定义的值宏的引用,=ArgN 表示对形参的引用。

但是,下面的代码示例不是可接受的条目。

*Attrib2: =Arg1(=Arg2, =Arg3(=Macro1, =Macro2))   *%  Not Valid !

如果宏引用与宏声明的形参名称匹配,则可以假定它是对该形参的引用,而不管是否存在具有该名称的实际宏。 可以通过将命名空间限定符与宏引用结合使用来避免这种歧义。 但是,不能将命名空间限定符与形参一起使用。

对于值宏,如果在 *Macros 构造中未声明任何正式参数列表,则对 中定义的宏的任何引用都不应后跟参数列表。 此类列表不会被视为宏引用的一部分。

例如,请考虑以下代码示例是否定义了 =Macro1。

*Macros:   NoArgList
{
Macro1:  "a Value macro with no argument list"
Macro2:  "a Value macro with no argument list"
Macro3:  "a Value macro with no argument list"
}

然后,以下宏引用将被解释为三个单独的和不相关的宏引用。

*attribute:  =Macro1(=Macro2, =Macro3)

分析程序不会将 =Macro2、 =Macro3 (解释为 =Macro1 的参数列表) 。 此行为保留与当前 GPD 的向后兼容性。