web-dev-qa-db-ja.com

Cのtypeof演算子

Cのtypeofは本当に演算子ですか?
Cにはポリモーフィズムがないため、実行時に何もする必要がないと考えています。つまり、typeofへの答えはコンパイル時に知られています。 (コンパイル時に知られていないtypeofの使用を考えることはできません。)したがって、演算子よりもコンパイル時のディレクティブのようです。

Typeofは(プロセッサ)ランタイム(GCC)を使用しますか?

42
Doug

typeofはコンパイラの拡張機能であるため、実際には定義はありませんが、Cの伝統では、演算子です(例:sizeofおよび_Alignofは演算子とも見なされます。

また、Cには、実行時にのみ決定される動的な型(変数変更(VM)型)があります。

size_t n = strtoull(argv[1], 0, 0);
double A[n][n];
typeof(A) B;

実行時にのみ決定できます。

52
Jens Gustedt

これはGNU拡張機能です。一言で言えば、別のオブジェクトと同じ型を持つオブジェクトを宣言するのに便利な方法です。たとえば:

int x;         /* Plain old int variable. */
typeof(x) y;   /* Same type as x. Plain old int variable. */

コンパイル時に完全に動作します 主にマクロで使用されます。 typeofに依存するマクロの有名な例の1つはcontainer_of

27
cnicutar

これはGCCコンパイラのC拡張です。 http://gcc.gnu.org/onlinedocs/gcc/Typeof.html を参照してください

7
André Oriani

正確に演算子ではなく、キーワードです。 いいえ、ランタイムマジックを実行しません。

4
user529758