2012-08-22 20 views
33

¿Hay typeof en C, realmente un operador?
Estoy pensando porque no hay polimorfismo en C, que no hay nada que hacer en el tiempo de ejecución. Es decir, la respuesta a typeof se conoce en tiempo de compilación. (No puedo pensar en un uso de typeof que no se conocería en tiempo de compilación). Así que parece ser más una directiva en tiempo de compilación, que un operador.typeof operator en C

¿Utiliza cualquier typeof (procesador) en tiempo de ejecución (en GCC)?

+17

C no tiene el operador 'typeof', que es una extensión del compilador. –

Respuesta

37

Dado que typeof es una extensión del compilador, no existe realmente una definición para él, pero en la tradición de C sería un operador, por ejemplo sizeof y _Alignof también se consideran operadores.

Y se equivoca, C tiene tipos dinámicos que se determinan solamente en tiempo de ejecución: (VM) los tipos de variables modificadas.

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

solo se puede determinar en tiempo de ejecución.

+11

No tenga miedo de vincular a [fuentes interesantes] (http://gustedt.wordpress.com/2011/01/09/dont-be-afraid-of-variably-modified-types/) con respecto a este tema :) –

+1

@NikolaiRuhe, no habría pensado en eso como un recurso principal para los tipos de VM ... pero si usted lo dice :) –

+0

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

3

No es exactamente un operador, y no una palabra clave. Y no, no tiene magia de tiempo de ejecución.

+0

Motivo de los votos a favor –

23

Es una extensión de GNU. En pocas palabras, es una forma conveniente de declarar un objeto que tiene el mismo tipo que otro. Por ejemplo:

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

funciona del todo en tiempo de compilación y se usa principalmente en las macros. Un ejemplo famoso de macro que se basa en typeof es container_of.

+4

No creo que funcione completamente en compilación, aunque debo admitir que no lo compré: creo que también funciona para VLA y otros tipos de VM. Entonces esto solo puede determinarse en tiempo de ejecución. –

+0

@JensGustedt Tienes razón. – cnicutar