Freigeben über


GDL-Makroargumente

Der Inhalt einer Makrodefinition kann auf alle, einige oder keine formalen Argumente verweisen, insbesondere für Wertmakrodefinitionen, bei denen mehrere Wertmakrodefinitionen innerhalb eines *Makros-Konstrukts mit einer einzigen formalen Argumentliste auftreten können, die von allen Definitionen gemeinsam verwendet wird. In diesem Fall kann eine Definition auf einige der formalen Argumente verweisen, während eine andere auf keine verweist.

Wenn eine Makrodefinition Verweise auf ein oder mehrere formale Argumente auslässt, kann die Parameterliste, die angegeben wird, wenn auf das Makro verwiesen wird, diese fehlenden Parameter durch Kommas (,) angeben, die nichts trennen.

Der folgende Makroverweis verwendet beispielsweise nur das fünfte Argument. Die ersten vier werden weggelassen.

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

Sie müssen überhaupt keine nachgestellten Parameter angeben. Wenn das Makro im vorherigen Beispiel 10 formale Argumente deklariert, aber nur auf das fünfte Argument verweist, wäre das vorherige Beispiel weiterhin eine gültige Möglichkeit, auf das Makro zu verweisen.

Bei Wertmakros ist kein Leerzeichen zwischen dem Makroverweis und der zugehörigen Parameterliste zulässig. Diese Syntax ermöglicht es dem Parser, zwischen einem Makroverweis zu unterscheiden, der keine Argumente verwendet, auf die zufällig etwas folgt, das wie eine Parameterliste aus einem Makroverweis aussieht, der eine Parameterliste verwendet.

Betrachten Sie beispielsweise das folgende Codebeispiel.

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

Wenn Makrodefinitionen geschachtelt sind, können die formalen Argumente nur vom Inhalt des Makros verwendet werden, das die Argumente deklariert hat. Der Inhalt geschachtelter Makrodefinitionen kann nicht auf die Argumente verweisen, die das einschließende Makro definiert.

Makroverweise, die innerhalb einer Makrodefinition auftreten, können Parameterlisten enthalten, die Makros benennen, die selbst Parameterlisten erfordern. Eine Parameterliste kann jedoch nicht für Verweise auf formale Argumente bereitgestellt werden. Beispielsweise ist der folgende Eintrag in einer Blockmakrodefinition akzeptabel.

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

Im vorherigen Beispiel stellt =MacroN einen Verweis auf ein zuvor definiertes Wertmakro und =ArgN einen Verweis auf ein formales Argument dar.

Das folgende Codebeispiel ist jedoch kein zulässiger Eintrag.

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

Wenn ein Makroverweis mit einem formalen Argumentnamen übereinstimmt, den das Makro deklariert, können Sie davon ausgehen, dass es sich um einen Verweis auf dieses formale Argument handelt, unabhängig davon, ob ein echtes Makro mit diesem Namen vorhanden ist. Sie können solche Mehrdeutigkeiten vermeiden, indem Sie einen Namespacequalifizierer mit dem Makroverweis verwenden. Sie können jedoch keine Namespacequalifizierer mit formalen Argumenten verwenden.

Wenn bei Wertmakros keine formale Argumentliste im *Makros-Konstrukt deklariert wurde, sollte jeder Verweis auf die Makros, die in definiert sind, nicht mit einer Parameterliste verfolgt werden. Eine solche Liste wird nicht als Teil der Makroreferenz betrachtet.

Stellen Sie sich beispielsweise vor, ob =Macro1 durch das folgende Codebeispiel definiert wird.

*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"
}

Anschließend wird der folgende Makroverweis als drei separate und nicht verknüpfte Makroverweise interpretiert.

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

Der Parser interpretiert (=Macro2, =Macro3) nicht als Parameterliste für =Macro1. Dieses Verhalten behält die Abwärtskompatibilität mit aktuellen GPDs bei.