言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理にJavaScriptを使用しています。
より快適にご利用頂くため、JavaScriptを有効にしたうえで当サイトを閲覧することをお勧めいたします。

C言語辞典

  1. トップページ
  2. C言語辞典
  3. typedef

typedef

対応: C89(1989)

既存の型に新しい名前(別名)を付けます。長い型名を短くしたり、プラットフォーム依存の型を抽象化したり、構造体・共用体・列挙型を扱いやすくするために使われます。

構文

// 基本型に別名を付けます。
typedef 既存の型 新しい型名;

// struct に別名を付けます(struct キーワードを省略できます)。
typedef struct {
    型 メンバ;
} 型名;

// 関数ポインタ型に別名を付けます。
typedef 戻り値の型 (*型名)(引数の型, ...);

// 配列型に別名を付けます。
typedef 型 型名[要素数];

typedef の主な用途

用途概要
型名の短縮『unsigned long long int』を『uint64_t』のように短くして書きやすくします。
struct の省略構造体宣言に別名を付けることで、変数宣言時に『struct』キーワードを省略できます。
移植性の向上プラットフォーム依存の型を別名でラップし、ソースコードの変更箇所を1か所にまとめます。
関数ポインタの可読性関数ポインタ型に意味のある名前を付けて、宣言を読みやすくします。
抽象型の定義APIのユーザーに内部実装を隠蔽し、型の変更が呼び出し元に影響しないようにします。

サンプルコード

sample_typedef.c
#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 = "ブルマ";
    printf("ユーザー名: %s\n", username); // 『ユーザー名: ブルマ』と出力されます。

    // 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;
}
gcc typedef.c -o typedef
./typedef
byte_t: 255, uint_t: 1000000
p1: (10, 20)
p2: (30, 40)
比較結果: 2
ユーザー名: ブルマ
uint8_t: 255
uint32_t: 4000000000

概要

『typedef』は新しい型を作るわけではなく、既存の型に別名を付けるだけです。そのため、元の型と完全に互換性があり、一方を使うべき場所でもう一方を使えます。

C標準の『<stdint.h>』では『uint8_t』・『int32_t』・『uint64_t』など固定幅の整数型が提供されており、これらも内部では『typedef』で定義されています。プラットフォームをまたぐコードでは、サイズが環境依存になる『int』や『long』の代わりにこれらの固定幅型を使うことを推奨します。

構造体・共用体・列挙型と組み合わせるのが最も多い使い方です。詳しくは『struct(構造体)』・『union(共用体)』・『enum(列挙型)』を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。