名前空間
変種
操作

Typedef宣言

From cppreference.com
< c‎ | language

Typedef宣言は、識別子を型エイリアスとして宣言する方法を提供し、複雑な可能性のある型名を置き換えるために使用されます。

typedefキーワードは、宣言において、記憶域クラス指定子の文法的な位置で使用されますが、記憶域やリンケージには影響しません。

typedef int int_t; // declares int_t to be an alias for the type int
typedef char char_t, *char_p, (*fp)(void); // declares char_t to be an alias for char
                                           // char_p to be an alias for char*
                                           // fp to be an alias for char(*)(void)

目次

[編集] 説明

宣言typedefを記憶域クラス指定子として使用する場合、そこで宣言されるすべての宣言子は、指定された型のエイリアスとして識別子を定義します。1つの宣言で許可される記憶域クラス指定子は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 is int[]
A a = {1, 2}, b = {3,4,5}; // type of a is int[2], type of b is int[3]

typedef宣言は、タグ名前空間の名前を通常の名前空間に注入するためにしばしば使用されます。

typedef struct tnode tnode; // tnode in ordinary name space
                            // is an alias to tnode in tag name space
struct tnode {
    int count;
    tnode *left, *right; // same as struct tnode *left, *right;
}; // now tnode is also a complete type
tnode s, *sp; // same as struct tnode s, *sp;

タグ名前空間をまったく使用しないようにすることもできます。

typedef struct { double hi, lo; } range;
range z, *zp;

typedef名は、複雑な宣言の構文を簡略化するためにも一般的に使用されます。

// array of 5 pointers to functions returning pointers to arrays of 3 ints
int (*(*callbacks[5])(void))[3];
 
// same with typedefs
typedef int arr_t[3]; // arr_t is array of 3 int
typedef arr_t* (*fp)(void); // pointer to function returning 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++ドキュメント typedef宣言について
English 日本語 中文(简体) 中文(繁體)