typeof 演算子は、その引き数の型を戻します。 これは、式または型とすることができます。言語フィーチャーによって、式から型を派生させることができます。代替スペルの キーワード、__typeof__ が推奨されます。式 e が与えられると、__typeof__ (e) を、たとえば、宣言やキャストなど、 型名が必要となるどの箇所でも使用できます。
typeof 演算子は、GNU C で開発されたプログラムの処理のために提供されている 直交言語拡張機能です。 この言語フィーチャーは、AltiVec 言語拡張機能が使用可能に なっている場合に、ベクトル型をオペランドとして受け入れるために、 Mac OS X プラットフォーム用に拡張されました。
typeof 構成の形式は、次のとおりです。
>>-+-__typeof__-+--(--+-expr------+--)------------------------->< '-typeof-----' '-type-name-'
typeof 構成自体は式ではなく、型の名前です。typeof 構成は、typedef を使用して定義された型名のように動作します (構文は sizeof に似ています)。
以下の例は、その基本構文を示します。式 e の場合:
int e; __typeof__(e + 1) j; /* the same as declaring int j; */ e = (__typeof__(e)) f; /* the same as casting e = (int) f; */
typeof 構成の使用は、typedef 名を定義した場合と同じです。 以下が与えられていると想定した場合、
int T[2]; int i[2];
以下を記述することができます。
__typeof__(i) a; /* all three constructs have the same meaning */ __typeof__(int[2]) a; __typeof__(T) a;
コードの振る舞いは、int a[2]; を宣言した場合と同様になります。
ビット・フィールドについては、typeof はビット・フィールドの基本となる型を表 します。 例えば int m:2; では、typeof(m) は int です。ビット・フィールド・プロパティーは予約されていないため、 typeof(m) n; の n は int n と同じですが、int n:2 ではありません。
typeof 演算子は、sizeof 内およびそれ自身の中でネストが可能です。 以下の int へのポインター配列としての arr の宣言は、同じです。
int *arr[10]; /* traditional C declaration */ __typeof__(__typeof__ (int *)[10]) a; /* equivalent declaration */
typeof 演算子は、式 e がパラメータ ーであるマクロ定義で使用すると便利です。 例えば、次のような場合です。
#define SWAP(a,b) { __typeof__(a) temp; temp = a; a = b; b = temp; }
関連参照