Skip to content

Instantly share code, notes, and snippets.

@n01e0
Last active August 23, 2019 07:42
Show Gist options
  • Save n01e0/c42c71a1099f608d4b26b966ccb41883 to your computer and use it in GitHub Desktop.
Save n01e0/c42c71a1099f608d4b26b966ccb41883 to your computer and use it in GitHub Desktop.
Cでジェネリック

Cでジェネリック

Cでもジェネリックが使える

関数オーバーロードみたいな感じ

引数の型によって関数の動作を変えたい

前に任意の型を引数に取る関数の実装を行ったが、なかなか無理があった。

あれではまだ満足出来ない。

与えた引数の型からマクロが呼び出す関数を変えるようにしたい。

_Generic

_Genericは関数マクロに適用出来る。

_Genericを使う事で、引数の型に応じて呼び出す関数を変えられる。

文法は

#define マクロ名(引数) _Generic((判断に用いる引数), 引数の型: 型が一致した時に呼び出す関数)(関数に渡す引数))

の形式で書く。

たとえば

#include <stdio.h>
#define YOSHINANI_PRINT(x) _Generic((x), \
    int: printf("%d\n", x), \
    char: printf("%c\n", x), \
    char *: printf("%s\n", x))

このように書くとYOSHINANI_PRINTに渡した値の型によってprintfの引数をよしなにして出力してくれる。

便利じゃん

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment