おもにC言語や C++ に存在するキーワードで、型に別名(エイリアス)を付けるために用いられます。
C言語や C++ の typedef は以下の構文で使用します。
typedef 元の名前 別名;単なる int や char のような基本型では用途が明確になりませんが、分かりやすい別名を与えられればコードの可読性を高められます。
typedef int money_t; // int型に money_t という別名を付けて、金額を表すことを明確にするあくまで「既存の型に対する別の名前」に過ぎず、「まったく別の新しい型」が定義されたわけではありません。そのため、たとえば int型の仮引数を持つ関数に money_t型の実引数を渡すことや、両者の型の値を比較することなどは依然として可能です。まったく別の新しい型が必要なら、新しい構造体型を定義するのが適切です。
こうして与えられた別名のことを typedef名と呼びます。また、こうして別名を定義することを指して型定義と呼ぶこともあります(新規の型ではないので、型定義とは区別する考え方もありえます)。
既存の型に対する別の名前でありつつも、元の型とは異なる型として区別されるように型定義することを、strong typedef と呼ぶことがあります。直接的にサポートしているプログラミング言語も存在しますが、C言語や C++ では、前述のように構造体を使って疑似的に実現することになります。
C言語では、構造体や共用体、列挙型を使用するときにタグ名を記述する必要がありますが、typedef を使うことで省略することができます。
// typedef を使わない場合
struct Student_tag {
char name[STUDENT_NAME_LEN];
int grade;
int class;
int score;
};
struct Student_tag student; // structキーワードとタグ名が必要
// typedef を使ってタグ名を省略する場合
typedef struct {
char name[STUDENT_NAME_LEN];
int grade;
int class;
int score;
} Student;
Student student; // structキーワードとタグ名が不要C言語の typedef についての詳細は、C言語編「整数型」「構造体」を参照してください。
C++ では、テンプレートパラメータの指定で型名が長く複雑になる場合に、簡潔に記述する目的でも利用できます。
typedef std::vector<int>::size_type vsize_t;C++ では usingキーワードによる方法でも同様の効果を得られます。typedef とは、元の名前と別名を記述する順序が入れ替わることに注意してください。
using vsize_t = std::vector<int>::size_type;この構文はエイリアス宣言と呼ばれます。
エイリアス宣言は、エイリアステンプレートを定義する用途にも使われます。
C++ の typedef および using の解説は、新C++編「符号無し整数」「クラステンプレート」を参照してください。
Programming Place Plus のトップページへ
| はてなブックマーク に保存 | Facebook でシェア | X で ポスト/フォロー |
| LINE で送る | noteで書く |
|
| 管理者情報 | プライバシーポリシー |