Namespaces
Variants

Typedef declaration

From cppreference.net

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 型定義

キーワード

typedef

関連項目

C++ ドキュメント for typedef 宣言
翻訳のポイント: - HTMLタグ、属性、クラス名はそのまま保持 - ` typedef ` 内のC++キーワードは翻訳せず保持 - 「C++ documentation」→「C++ ドキュメント」 - 「declaration」→「宣言」 - フォーマットと構造は完全に維持