型名

データ型、つまり 型名 は、オブジェクトを宣言しなくても指定する必要があるものとして、いくつかの コンテキスト内で必須です。例えば、明示的なキャスト式を書きこみしているとき、または sizeof 演算子を型へ 適用しているときです。構文上、データ型の名前は、その型の関数の宣言またはその型のオブジェクトの宣言と同じですが、ID は使用しません。

型名を正確に読み書きするには、構文内に "虚数" ID を入れて、型名をより簡単なコンポーネントへ分割します。例えば、int は型指定子で、常に 宣言内の ID の左側に表示されます。虚数 ID は、この簡単なケースでは必要ありません。ただし、int *[5] (int への 5 つのポインターの配列) もまた、型名です。型指定子 int * は常に ID の左側に表示され、配列添え字演算子は常に右側に表示されます。この場合、虚数 ID は型指定子を区別するときに役立ちます。

一般的な規則では、宣言内の ID は、常に添え字演算子および関数呼び出し演算子の左側、型指定子、型修飾子、または間接演算子の右側に表示されます。 添え字演算子、関数呼び出し演算子、 および間接演算子のみを、宣言内に表示することができます。これらは、標準の演算子優先順位に従ってバインドされます。 この順位では、同じランクの優先順位を持つ添え字演算子または関数呼び出し演算子よりも、間接演算子の方が 優先順位が低くなります。間接演算子のバインディングを制御するために、括弧を使用しても構いません。

型名内に型名を持つことができます。例えば、関数型において、パラメーター型構文が関数 型名内でネストされます。同じ経験法則が、さらに繰り返し適用されます。

以下の構造体は、型の命名規則の適用について説明しています。

int *[5]       /* array of 5 pointers to int                               */
int (*)[5]     /* pointer to an array of 5 ints                            */
int (*)[*]     /* pointer to an variable length array of
                    an unspecified number of ints                          */
int *()        /* function with no parameter specification
                    returning a pointer to int                             */
int (*)(void)  /* function with no parameters returning an int             */
int (*const [])(unsigned int, ...)
               /* array of an unspecified number of
                    constant pointers to functions returning an int
                    Each function takes one parameter of type unsigned int
                    and an unspecified number of other parameters           */

コンパイラーは、任意の関数指定機能を、その関数を指すポインターに変換します。 この振る舞いによって、関数呼び出しの構文が単純化します。

int foo(float);   /* foo is a function designator */
int (*p)(float);  /* p is a pointer to a function */
p=&foo;           /* legal, but redundant         */
p=foo;            /* legal because the compiler turns foo into a function pointer */

C++ C++ では、キーワード typename および class (交換可能) は、型名を示します。

関連参照

IBM Copyright 2003