typedef文 - 型の別名を作成する
typedef文を使うと型の別名を作成できます。
typedef 型名 型の別名
構造体の別名を作成
構造体の別名を作成してみましょう。「struct spvm_field」という構造体に「SPVM_FIELD」という名前をつけます。
#include <stdint.h> // 構造体定義 struct spvm_field { int32_t id; const char* name; }; // 構造体の別名を作成 typedef struct spvm_field SPVM_FIELD;
構造体は、一つの型です。typedef文の型名として指定できます。
共用体型の別名を作成
共用体型の別名を作成してみましょう。「union spvm_value」という共用体型に「SPVM_VALUE」という名前をつけます。
#include <stdint.h> // 共用体定義 union spvm_value { int8_t bval; int16_t sval; int32_t ival; int64_t lval; float fval; double dval; void* oval; }; // 共用体の別名を作成 typedef union spvm_value SPVM_VALUE;
共用体は、一つの型です。typedef文の型名として指定できます。
構造体や共用体の定義の前に、型の別名をつける方法
上記の方法は、構造体や共用体の定義を行った後に、typedef文を使って型の別名を作成していました。
この順番を入れ替える方法があるのでしょうか? あります。
構造体や共用体の定義の前に、型の別名をつけてみましょう。
構造体や共用体の名前だけを先に宣言できるというC言語の仕様を利用します。
#include <stdint.h> // 構造体の別名を作成 struct spvm_field; typedef struct spvm_field SPVM_FIELD; // 構造体定義 struct spvm_field { int32_t id; const char* name; }; // 共用体の別名を作成 union spvm_value; typedef union spvm_value SPVM_VALUE; // 共用体定義 union spvm_value { int8_t bval; int16_t sval; int32_t ival; int64_t lval; float fval; double dval; void* oval; };
さて、これに何の意味があるのでしょうか?
これは、ヘッダ間読み込みを減らすための、型宣言ヘッダを作成する場合に役に立ちます。
typedef文はどんなときに使われている?
typedef文はどんなときに使われているでしょうか?
型を抽象化するため
typedef文は、型を抽象化するために、使われることがあります。
たとえば、size_t型は、C言語で、長さを表現するために使われますが、32bit環境と64bit環境では定義が異なったりします。
size_tは、C言語仕様では、「少なくとも16bitの符号なし整数型」と定義されているためです。
C言語の仕様に従っていれば、処理系によって、定義を変えてよいのです。
typedef unsigned int size_t; typedef unsigned long size_t; typedef unsigned long long size_t;
処理系によって、実際の定義は異なりますが、ソースコード上ではsize_tとして抽象化することができます。
structやunionを書くのがめんどくさいため
統一的に、型名として扱いたい場合は「struct ほにゃ」「union ほにゃ」と書くのは、少し面倒に感じます。
typedefを使うと、一つの型名のように扱えます。
ヘッダの相互参照や循環参照をなくすため
型宣言ヘッダを作成すると、ヘッダの相互参照や循環参照を回避することができます。
これはtypdef文の実用的な使用で非常に重要なものだと考えます。
typedef文はどこに書きますか?
typedef文は、ヘッダファイルに書きます。