「Generic」の版間の差分

提供: C言語入門
移動: 案内検索
(ページの作成:「_Generic とは、C11で追加された「総称選択」(Generic selection)です。引数の型に応じた適切な関数を選択できるマクロを記述...」)
 
(相違点なし)

2014年3月30日 (日) 18:40時点における最新版

_Generic とは、C11で追加された「総称選択」(Generic selection)です。引数の型に応じた適切な関数を選択できるマクロを記述できます。

読み方

_Generic
あんすこ じぇねりっく

概要

C++の言葉を借りて言えば、「関数のオーバーロード」するように、マクロを使える、ということになります。

従来までは、「引数の型」に応じて、マクロの呼び分けを行う必要がありました。 _Genericの登場により、「マクロが型に合わせて、関数を呼び分ける」ことが可能になりました。プログラマがマクロで「型に対応する関数」を定義する必要があります。

ソースコード

cbrtは、立方根を計算する関数です。cbrtは、型に応じた関数が用意されています。 型を意識せずに使えるように、 cbrtというマクロを用意したのが、以下のコードです。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define cbrt(X) _Generic((X), long double: cbrtl,       \
                default: cbrt,  \
                float: cbrtf)(X)
 
int
main(int argc, char *argv[])
{
        float   f = 3.3;
        double  d = 3.3;
        long double ld = 3.3;
        printf("%f\n", cbrt(f));        // cbrtf
        printf("%f\n", cbrt(d));        // cbrt
        printf("%Lf\n", cbrt(ld));      // cbrtl
 
        exit(EXIT_SUCCESS);
}

コンパイル

cc -Wall generic.c -lm

実行例

$ ./a.out
1.488806
1.488806
1.488806

できあがったバイナリを確認する

nm a.out |fgrep cbrt
                 U cbrt@@FBSD_1.0
                 U cbrtf@@FBSD_1.0
                 U cbrtl@@FBSD_1.2

関連項目