Typedef declaration
typedef宣言 は、識別子を型エイリアスとして宣言する方法を提供し、複雑な可能性のある 型名 を置き換えるために使用されます
キーワード typedef は、 宣言 内で、 記憶クラス指定子 の文法的位置で使用されますが、記憶域やリンケージには影響を与えません:
typedef int int_t; // int_tを型intのエイリアスとして宣言 typedef char char_t, *char_p, (*fp)(void); // char_tをcharのエイリアスとして宣言 // char_pをchar*のエイリアスとして宣言 // fpをchar(*)(void)のエイリアスとして宣言
目次 |
説明
もし 宣言 が typedef をストレージクラス指定子として使用する場合、その中のすべての宣言子は識別子を指定された型のエイリアスとして定義します。宣言ではストレージクラス指定子は1つしか許可されないため、typedef宣言は staticまたはextern にすることはできません。
typedef宣言は別個の型を導入するものではなく、既存の型の同義語を確立するだけです。したがって、typedef名は 互換性のある 型とエイリアスされます。typedef名は、 名前空間 を列挙子、変数、関数などの通常の識別子と共有します。
|
VLAのtypedefはブロックスコープでのみ使用できます。配列自体の宣言とは異なり、配列の長さは制御フローがtypedef宣言を通過するたびに評価されます: void copyt(int n) { typedef int B[n]; // B is a VLA, its size is n, evaluated now n += 1; B a; // size of a is n from before +=1 int b[n]; // a and b are different sizes for (int i = 1; i < n; i++) a[i-1] = b[i]; } |
(C99以降) |
注記
typedef名は 不完全型 であってもよく、通常通り完結させることができます:
typedef int A[]; // A は int[] です A a = {1, 2}, b = {3,4,5}; // a の型は int[2]、b の型は int[3] です
typedef宣言は、タグ name space から通常のname spaceへ名前を注入するためによく使用されます:
typedef struct tnode tnode; // tnodeは通常の名前空間で // タグ名前空間のtnodeへのエイリアス struct tnode { int count; tnode *left, *right; // struct tnode *left, *right; と同じ }; // これでtnodeは完全型でもある tnode s, *sp; // struct tnode s, *sp; と同じ
タグ名空間をまったく使用しないことも可能です:
typedef struct { double hi, lo; } range; range z, *zp;
typedef名はまた、複雑な宣言の構文を簡略化するためによく使用されます:
// 3つのintの配列へのポインタを返す関数へのポインタ5つの配列 int (*(*callbacks[5])(void))[3]; // typedefを使用した同じ宣言 typedef int arr_t[3]; // arr_tは3つのintの配列 typedef arr_t* (*fp)(void); // arr_t*を返す関数へのポインタ fp callbacks[5];
ライブラリは、システム依存または設定依存の型をtypedef名として公開することがよくあります。これは、ユーザーや他のライブラリコンポーネントに対して一貫性のあるインターフェースを提供するためです:
#if defined(_LP64) typedef int wchar_t; #else typedef long wchar_t; #endif
参考文献
- C23規格 (ISO/IEC 9899:2024):
-
- 6.7.8 型定義 (p: TBD)
- C17規格 (ISO/IEC 9899:2018):
-
- 6.7.8 型定義 (p: TBD)
- C11規格 (ISO/IEC 9899:2011):
-
- 6.7.8 型定義 (p: 137-138)
- C99規格 (ISO/IEC 9899:1999):
-
- 6.7.7 型定義 (p: 123-124)
- C89/C90標準 (ISO/IEC 9899:1990):
-
- 3.5.6 型定義
キーワード
関連項目
|
C++ ドキュメント
for
typedef
宣言
|
typedef
` 内のC++キーワードは翻訳せず保持
- 「C++ documentation」→「C++ ドキュメント」
- 「declaration」→「宣言」
- フォーマットと構造は完全に維持