Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
typedef
既存の型に新しい名前(別名)を付けます。長い型名を短くしたり、プラットフォーム依存の型を抽象化したり、構造体・共用体・列挙型を扱いやすくするために使われます。
構文
// 基本型に別名を付けます。
typedef 既存の型 新しい型名;
// struct に別名を付けます(struct キーワードを省略できます)。
typedef struct {
型 メンバ;
} 型名;
// 関数ポインタ型に別名を付けます。
typedef 戻り値の型 (*型名)(引数の型, ...);
// 配列型に別名を付けます。
typedef 型 型名[要素数];
typedef の主な用途
| 用途 | 概要 |
|---|---|
| 型名の短縮 | 『unsigned long long int』を『uint64_t』のように短くして書きやすくします。 |
| struct の省略 | 構造体宣言に別名を付けることで、変数宣言時に『struct』キーワードを省略できます。 |
| 移植性の向上 | プラットフォーム依存の型を別名でラップし、ソースコードの変更箇所を1か所にまとめます。 |
| 関数ポインタの可読性 | 関数ポインタ型に意味のある名前を付けて、宣言を読みやすくします。 |
| 抽象型の定義 | APIのユーザーに内部実装を隠蔽し、型の変更が呼び出し元に影響しないようにします。 |
サンプルコード
#include <stdio.h>
#include <stdint.h> // uint8_t, uint32_t などが定義されています。
// 基本型に別名を付けます。
typedef unsigned char byte_t;
typedef unsigned int uint_t;
typedef long long llong_t;
// struct に別名を付けます(struct キーワードが不要になります)。
typedef struct {
int x;
int y;
} Point;
// 関数ポインタ型に別名を付けます。
typedef int (*Comparator)(const void *, const void *);
// 配列型に別名を付けます。
typedef char Name[64];
int compare_int(const void *a, const void *b) {
return (*(int *)a - *(int *)b);
}
int main(void) {
// typedef した型を使います。
byte_t b = 255;
uint_t n = 1000000u;
printf("byte_t: %u, uint_t: %u\n", b, n);
// Point 構造体を struct なしで使えます。
Point p1 = {10, 20};
Point p2 = {.x = 30, .y = 40};
printf("p1: (%d, %d)\n", p1.x, p1.y); // 『p1: (10, 20)』と出力されます。
printf("p2: (%d, %d)\n", p2.x, p2.y); // 『p2: (30, 40)』と出力されます。
// 関数ポインタ型の別名を使います。
Comparator cmp = compare_int;
int a = 5, bb = 3;
printf("比較結果: %d\n", cmp(&a, &bb)); // 正の値が出力されます。
// 配列型の別名を使います。
Name username = "Taro";
printf("ユーザー名: %s\n", username); // 『ユーザー名: Taro』と出力されます。
// stdint.h の固定幅整数型(typedef で定義されています)。
uint8_t u8 = 255;
uint32_t u32 = 4000000000u;
printf("uint8_t: %u\n", u8);
printf("uint32_t: %u\n", u32);
return 0;
}
概要
『typedef』は新しい型を作るわけではなく、既存の型に別名を付けるだけです。そのため、元の型と完全に互換性があり、一方を使うべき場所でもう一方を使えます。
C標準の『<stdint.h>』では『uint8_t』・『int32_t』・『uint64_t』など固定幅の整数型が提供されており、これらも内部では『typedef』で定義されています。プラットフォームをまたぐコードでは、サイズが環境依存になる『int』や『long』の代わりにこれらの固定幅型を使うことを推奨します。
構造体・共用体・列挙型と組み合わせるのが最も多い使い方です。詳しくは『struct(構造体)』・『union(共用体)』・『enum(列挙型)』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。