C言語においてtypedefを使用すると既にあるデータ型に新しい名前をつけることができます。次のように記述します。
typedefを使用すると既にあるデータ型に新しい名前をつけることができます。このページではC言語のtypedefについて説明します。
C言語においてtypedefを使用すると既にあるデータ型に新しい名前をつけることができます。次のように記述します。
typedef 既存のデータ型 新しい名前;
具体的には下記のように記述します。
typedef unsigned int Uint;
このように書くと名前Uintがunsigned intの同義語になります。以降、Uint型はunsigned int型と全く同様に使用可能となります。宣言だけでなく型変換にも使用できます。
Uint num, len;
Uint *value;
typedef宣言を使う利点は主に2つあります。1つは移植性です。マシンに依存するデータ型にtypedefで新しい名前をつけてそれを使用しておけば、プログラムを移植する際にはtypedefの部分のみ変更すればよいということになります。2つめは可読性です。データ型に使用目的や意味がわかるような新しい名前をつけて使用すれば、プログラムが理解しやすくなります。
このようにtypedefの使用はたいへん便利です。しかし、使いすぎるとかえって混乱を招くこともありますので、注意して使用しましょう。
ビット演算処理である右シフト演算(>>)を符号付きの整数に対して行った場合、算術シフトを行う処理系と論理シフトを行う処理系があります。そのため通常、ビット演算は符号なしの整数型に対してのみ行います。うっかり符号付きの整数に対してビット演算を行わないようにしたいと考えた場合、typedefでビット演算使用限定の型を新たに宣言し、ビット演算をする必要のある変数は必ずその型を用いるルールにするという方法がとれます。
typedef unsigned char BYTE;
BYTE data;
また、次の例はchar *を新たにStringPtr型にtypedefしています。これにより、StringPtr型の変数は文字列を使用するための変数であることが直感的にわかり、ソースコードが読みやすくなることが期待できます。
typedef char *StringPtr;
StringPtr s;
s = (StringPtr)malloc(200);
typedefは構造体の宣言を簡潔にするためにもよく使われます。宣言文が長く、少しわかりづらいので注意しましょう。
typedef struct InputData *INPUT_DATA_PTR;
typedef struct InputData {
int value;
INPUT_DATA_PTR next;
} INPUT_DATA;
int main(int argc, char *argv[])
{
int i;
int n;
INPUT_DATA_PTR head = NULL;
最後に関数プロトタイプに対するtypedefの使用例を見てみましょう。次の関数宣言は、引数として、1つのint型とint型を引数にとる関数へのポインタを使用し、戻り値としてint型を引数にとる関数へのポインタを返す関数の宣言です。
void (*reg_func(int n, void (* f)(int)))(int);
とてもわかりにくいのでtypedefを使用してみます。下記のように記述すればかなりわかりやすくなると思います。
typedef void (*MYFUNC)(int a);
MYFUNC reg_func(int n, MYFUNC f);