c / expert
Snippet
Kompilierzeit-Polymorphie über typgenerische Ausdrücke in C11
C11 führte das Schlüsselwort _Generic ein, das eine typbasierte Makro-Ausführung zur Kompilierzeit ohne Laufzeit-Overhead oder Name-Mangling ermöglicht. Der Compiler wertet den statischen Typ des Steuerausdrucks aus und wählt den entsprechenden Funktionszeiger oder die Makro-Ersetzung aus. Dies verleiht C Funktionsüberladungsfähigkeiten bei gleichzeitiger Wahrung der strikten statischen Typisierung.
snippet.c
c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>#include <math.h>#define print_val(X) _Generic((X), \int: print_int, \double: print_double, \default: print_unknown \)(X)void print_int(int x) { printf("Integer: %d\n", x); }void print_double(double x) { printf("Double: %.2f\n", x); }void print_unknown(void *x) { (void)x; printf("Unknown type\n"); }int main(void) {int i = 42;double d = 3.14159;print_val(i);print_val(d);return 0;}
Erklärung
1
#define print_val(X) _Generic((X), \
Definiert ein typgenerisches Makro, das die Typprüfung für das Argument X einleitet.
2
int: print_int, \
Ordnet Integer-Argumente zur Kompilierzeit direkt der Implementierung print_int zu.
3
double: print_double, \
Ordnet doppeltgenaue Gleitkomma-Argumente der Implementierung print_double zu.
4
default: print_unknown \
Bietet einen Rückfallpfad für alle Typen, die nicht explizit in der generischen Zuordnungsliste angegeben sind.
5
)(X)
Ruft den ausgewählten Funktionszeiger sofort mit dem ursprünglichen Argument X auf.