「Generic」の版間の差分
提供: C言語入門
(相違点なし)
|
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