2012-08-22 26 views
33

Cの型は本当に演算子ですか?
Cには多型性がないので、実行時には何もしないと思っています。つまり、typeofへの答えはコンパイル時に知られています。 (私はコンパイル時に知られていない型の使用を考えることはできません)。それは演算子よりコンパイル時の指示のほうが多いようです。Cのtypeof演算子

typeofは(プロセッサ)実行時間を(GCCで)使用しますか?

+17

Cには 'typeof'演算子がありません。これはコンパイラ拡張です。 –

答えて

37

typeofはコンパイラの拡張であるため、実際の定義はありませんが、Cの伝承では演算子になります。sizeof_Alignofも演算子とみなされます。

あなたは誤解を受けていますが、Cは実行時にのみ決定される動的型を持っています。

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

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

+11

このトピックに関して[興味深い情報源](http://gustedt.wordpress.com/2011/01/09/dont-be-afraid-of-variably-modified-types/)にリンクすることを恐れてはいけません:) –

+1

@NikolaiRuheは、VMタイプの主なリソースとして考えていないでしょう...しかし、もしそうなら、:) –

+0

[google](http://www.google.com/search?q=VM + VLA + C) –

3

を参照して、GCCコンパイラからCの拡張機能です。そして、いいえ、それはランタイムマジックを何もしません。

+0

ダウンボートの理由? –

23

GNU拡張です。簡単に言えば、同じタイプのオブジェクトを別のオブジェクトと宣言すると便利です。たとえば:

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

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

+4

コンパイル時には完全に動作するとは思わないが、私はチェックしなかったことを認めなければならない:VLAや他のVMタイプでも動作すると思う。したがって、これは実行時にのみ決定できます。 –

+0

@JensGustedtあなたは正しいです。 – cnicutar