前言

Generic 在C11上出現,我們可以透過實作出物件導向中的多型。要注意的是 Generic 是在編譯時期運作的。

主要內容

 1#include <stdio.h>
 2void funci(int x) { printf("func value = %d\n", x); }
 3void funcc(char c) { printf("func char = %c\n", c); }
 4void funcdef(double v) { printf("Def func's value = %lf\n", v); }
 5#define func(X) \
 6    _Generic((X), \
 7        int: funci, char: funcc, default: funcdef \
 8    )(X)
 9int main() {
10        func(1);
11        func('a');
12        func(1.3);
13        return 0;
14}

在多個參數的使用上比較繁瑣,需要自行作每個參數的組合。

 1#define format2(x,y) _Generic((x), \
 2    char: _Generic((y), \
 3        char:"%c - %c\n", \ char*:"%c - %s\n", \
 4        int:"%c - %d\n", \
 5        default:"error\n" \
 6        ), \
 7    char*: _Generic((y), \
 8        char:"%s - %c\n", \
 9        char*:"%s - %s\n", \
10        int:"%s - %d\n", \
11        default:"error\n" \
12        ), \
13    int: _Generic((y), \
14        char:"%d - %c\n", \
15        char*:"%d - %s\n", \
16        int:"%d - %d\n", \
17        default:"error\n" \
18        ), \
19    default:"error\n" \
20  )
21
22#define print2(x, y) printf(format2(x,y),x,y)
23int main(int argc, char **argv)
24{
25    printf("test 2 parameters\n");
26    print2(3, 'c');
27    return 0;
28}