C11の_Genericキーワードとは?型に応じて動作を切り替える汎用マクロの定義方法
_Genericキーワードとは?
C言語の_Genericキーワードは、データ型ごとに異なる処理を行うマクロ(MACRO)を定義するために使用される機能です。このキーワードはC11標準規格で新たに追加され、プログラマーがマクロをより効率的かつ柔軟に活用できるよう設計されています。
_Genericは、渡された式の型をコンパイル時に判定し、その型に対応する式へと置き換えます。つまり、同じマクロ名でありながら、引数の型に応じて異なる関数や処理を自動的に呼び分けることが可能になります。
基本構文
#define dec(x) _Generic((x), long double : decl, float : decf, default : deci)(x)
上記のように、_Genericの第1引数に判定対象の式を指定し、続けて「型: 対応する式」のペアを列挙していきます。どの型にも一致しなかった場合に備え、defaultを必ず指定しておくのが一般的な書き方です。
サンプルコード
次のコードでは、渡された値のデータ型に応じて異なる数値を返すマクロtypecheckを定義しています。
#include <stdio.h>
#define typecheck(T) _Generic( (T), char: 1, int: 2, long: 3, float: 4, default: 0)
int main(void) {
printf( "passing a long value to the macro, result is %d \n", typecheck(2353463456356465));
printf( "passing a float value to the macro, result is %d \n", typecheck(4.32f));
printf( "passing a int value to the macro, result is %d \n", typecheck(324));
printf( "passing a string value to the macro, result is %d \n", typecheck("Hello"));
return 0;
}
実行結果
passing a long value to the macro, result is 3 passing a float value to the macro, result is 4 passing a int value to the macro, result is 2 passing a string value to the macro, result is 0
実行結果から、long型の値には3、float型の値には4、int型の値には2が返され、リストに含まれていない文字列(char*)にはdefaultで指定した0が返されていることがわかります。このように_Genericを使えば、1つのマクロで複数の型に対応した処理を簡潔に実装できます。
_Genericを使う際のポイント
- 型の判定はコンパイル時に行われるため、実行時のオーバーヘッドが発生しない。
- 第1引数の制御式そのものは評価されないため、安全に利用できる。
- 利用にはC11以降の規格に対応したコンパイラ(GCCやClangなど)が必要。
-
JavaScriptのthisキーワードとは?参照先のオブジェクトをわかりやすく解説
JavaScriptのthisキーワードは、そのキーワードが属しているオブジェクトを参照します。大きな特徴として、使用される文脈によって参照先が変化するという点があり、これがthisの挙動を理解するうえで重要なポイントとなります。 thisが参照するオブジェクトの一覧 単独で使用した場合、または通常の関数内: グローバルオブジェクト(ブラウザ環境では window オブジェクト)を参照します。 オブジェクトのメソッド内: そのメソッドを所有するオブジェクト自身を参照します。 イベントリスナー内: イベントを受け取ったHTML要素を参照します。 サンプルコード 以下は、JavaScriptの
-
JavaScriptで関数をコールバックとして渡す方法
JavaScriptで関数をコールバックとして渡すJavaScriptでは、関数は第一級オブジェクト(ファーストクラスオブジェクト)として扱われるため、他の値と同じように変数に代入したり、引数として別の関数に渡したりすることができます。このように引数として渡され、後から呼び出される関数をコールバック関数と呼びます。コールバックを活用することで、処理の柔軟性が高まり、再利用可能なコードを書くことができます。以下は、add2() 関数を multiply9() 関数のコールバックとして渡すサンプルコードです。コード例<!DOCTYPE html> <html lang="