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文は、ヘッダファイルに書きます。

関連情報