GNU-C Erweiterungen

Referenz: Using and Porting GNU CC - Extensons to the C Language Family

zusammengefaßt von Michael Neumann, letzte Änderung: 18.02.1999

 

 


Anweisungsblöcke, die in runde Klammern eingeschlossen werden, werden als Ausdrücke behandelt.

Beispiel:

int a = ({ int b=10; b+10; });

evaluiert zu a = 20


Labels können als lokal deklariert werden

Innerhalb eines Anweisungsblockes können lokale Labels deklariert werden, indem am Anfang des Blockes das Label mit __label__ labelname deklariert wird.

Beispiel:

{
   __label__ sprung;

   ...
   sprung:
   ...
   goto sprung;
}

Die Adresse eines Labels kann bestimmt werden

Mit dem Operator && kann die Adresse eines Labels bestimmt werden, welche vom Typ void* ist und konstant ist. Mit goto *exp kann zu einer selbst berechneten bzw. durch den Operator && bestimmte Adresse gesprungen werden, wobei exp vom Typ void* sein muß.

Beispiel:

void *ptr = &&sprung;
goto *ptr;
...
sprung:
...

Geschachtelte Funktionen (wird nicht unter GNU C++ unterstützt)

Die geschachtelten Funktionen können auf alle Variablen der äußeren Funktion zugreifen und von außerhalb der Hauptfunktion aufgerufen werden, jedoch sollte das nur solange geschehen, solange die äußere Funktion noch nicht beedet wurde.

Beispiel:

foo (int a, int b)
{
   int square(int x) { return x * x; }
   return square(a) * square(b);
}

Constructing Function Calls - entfällt -


Typ eines Ausdruckes benennen

Mittels typedef name = expr bekommt name den Typ von expr.

Beispiel:

typedef an_int = 12*34-2;	// selber Typ wie unten
typdef int another_int;		// selber Typ wie oben
an_int i = 34;
another_int j = 34;