Typauswahl in C
Die Typauswahl ist kein Aufruf, sondern eine aufrufähnliche Spezialschreibweise, bei der an der Stelle eines Funktionsnamens das Wort »_Generic« steht. Diese Schreibweise erlaubt es, einen Ausdruck anzugeben, dem eine Liste von Typen folgt. Der Wert dieser Spezialschreibweise ist dann der Wert des Ausdrucks, der hinter dem Typ des ersten Ausdrucks steht.
main.c
#include <stdio.h>
int main( void )
{ printf
( "%d\n", _Generic( 0, int: 16, double: 15, default: 37 )); }Protokoll
16
main.c
#include <stdio.h>
int main( void )
{ printf
( "%d\n", _Generic( 0.0, int: 16, double: 15, default: 37 )); }Protokoll
15
main.c
#include <stdio.h>
int main( void )
{ printf
( "%d\n", _Generic( ".", int: 16, double: 15, default: 37 )); }Protokoll
37
Die Angabe »default« kennzeichnet den Wert, der sich ergeben soll, wenn keiner der zuvorgenannten Typen der Typ des ersten Ausdrucks ist.
Wir können auf diese Weise nun bestätigen, daß der Ausdruck »0« den Typ »int« und der Ausdruck »0.0« den Typ »double« hat. An Stelle von Numeralia (wie oben »16«, »15« und »37«) sind auch kompliziertere Ausdrücke und Ausdrücke anderer Typen als »int« gestattet, die auch nicht alle denselben Typ haben müssen.
- Syntax (vereinfacht)
.--------. .-. .----------. .-. .-----------------. .-.
--->( _Generic )--->( ( )--->| Ausdruck |--->( , )--->| Zuordnungsliste |--->( ) )--->
'--------' '-' '----------' '-' '-----------------' '-'Zuordnungsliste
.-----------.
---.--->| Zuordnung |---.--->
^ '-----------' |
| .-. |
'--------( , )-------'
'-'Zuordnung
.----------. .-. .----------.
---.--->| Datentyp |---.--->( : )--->| Ausdruck |--->
| '----------' ^ '-' '----------'
| .-------. |
'--->( default )----'
'-------'
{$ugy~}