2012-08-22 81 views
33

是C中的typeof,真的是运算符吗?
我在想,因为在C中没有多态性,在运行时没有任何事情要做。也就是说,typeof的答案在编译时已知。 (我想不出在编译时就不知道的typeof的用法)。所以它似乎更像是编译时指令,而不是运算符。C中的typeof运算符

是否使用typeof(处理器)运行时(在GCC中)?

+17

C没有'typeof'运算符,这是一个编译器扩展。 –

回答

37

由于typeof是一个编译器扩展,它并没有真正的定义,但是在C的传统中它将是一个运算符,例如sizeof_Alignof也被看作是一个运算符。

而你错了,C有动态类型,只在运行时确定:变量修改(VM)类型。

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,不会认为这是虚拟机类型的主要资源......但如果你这么说:) –

+0

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

3

这不完全的运营商,而不是关键字。不,它不会执行任何运行时魔法。

+0

downvotes的原因? – 2012-08-23 21:04:32

23

这是一个GNU扩展。简而言之,这是一种方便的方式来声明与另一个类型相同的对象。例如:

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

它的工作原理完全在编译时 和它的主要的宏使用。宏观依靠typeof的一个着名的例子是container_of

+4

不要认为它完全可以在编译时使用,尽管我不得不承认我没有检查:我认为它也适用于VLA和其他VM类型。所以这只能在运行时间确定。 –

+0

@JensGustedt你说得对。 – cnicutar