typedef

typedef 宣言を使用すると、intfloat、および double の型指定子の代わりに使用できる、ユーザー独自の ID を定義できます。 typedef 宣言は、ストレージを予約しません。 typedef を使用して定義した名前は、新しいデータ型ではありませんが、その名前が表す データ型またはデータ型の組み合わせの同義語です。typedef の名前の ネーム・スペースは、他の ID と同じです。この 規則の例外は、typedef の名前が可変的に変更される型を指定する場合です。この場合は、ブロ ック・スコープを持ちます。

オブジェクトが typedef ID を使用して定義されているときは、定義されたオブジェクトの属性は、 あたかも、ID に関連したデータ型を明示的にリストすることによってオブジェクトが定義された場合と、 まったく同じです。

Linux typedef ストレージ・クラス指定子は、AltiVec 言語拡張機能が使用可能になっている 場合に、ベクトル型を処理するために拡張されました。 ベクトル型は typedef 宣言で使用することができ、他のベクトルの宣言を除いて、新しい型名は一般的な方法で使用できます。 ベクトル宣言のコンテキストで、 typedef 名は型指定子として許可されません。次の例は、ベクトル型での typedef の一般的な使用について説明します。

typedef vector unsigned short vint16;
vint16 v1;

typedef 宣言の例

次のステートメントは、LENGTHint の同義語として宣言し、 この typedef を使用して lengthwidth、および height を 整変数として宣言します。

typedef int LENGTH;
LENGTH length, width, height;

次の宣言は、上記の宣言と同じです。

int length, width, height;

同様に、typedef は、クラスの型 (構造体、共用体、または C++ のクラス) を定義するために使用できます。 次に例を示します。

typedef struct {
                int scruples;
                int drams;
                int grains;
               } WEIGHT;

そうすると、構造体 WEIGHT は、以下の宣言で使用できます。

WEIGHT  chicken, cow, horse, whale;

次の例では、yds の型は、「int を戻す、 パラメーターが指定されていない関数へのポインター」です。

typedef int SCROLL();
extern SCROLL *yds; 

次の typedef では、トークン struct は型名の一部です。 ex1 の型名は struct aex2struct b です。

typedef struct a { char x; } ex1, *ptr1;
typedef struct b { char x; } ex2, *ptr2; 

ex1 は、型 struct a、および ptr1 によって 指示されるオブジェクトの型と互換性があります。型 ex1 は、charex2、または struct b とは互換性がありません。

C++ このセクションでのここから先の説明は、C++ だけに適用されます。

C++ では、typedef 名は、同じスコープ内で宣言されたどのクラス型名 とも異なっている必要があります。 typedef 名がクラス型名と同じである場合、その typedef がクラス名の同義語である場合に 限ります。 これは、C の場合には当てはまりません。標準の C ヘッダーには、以下のものが含まれています。

typedef class C { /*  data and behavior  */ } C;

名前を付けずに typedef で定義された C++ のクラスには、ダミーの名前と、リンケージ用の typedef 名が付けられます。 このようなクラスには、コンストラクターまたはデストラクターを指定することはできません。 次に例を示します。

typedef class {
               Trees();
              } Trees;

関数 Trees() は、型名が指定されていないクラスの通常のメンバー関数です。 上記の例では、Trees は、名前なしクラスの別名で、それ自体はクラスの型名ではありません。 したがって、Trees() が、そのクラスのコンストラクターになることはできません。

関連参照

IBM Copyright 2003