2012-08-22 15 views
33

È typeof in C, davvero un operatore?
Sto pensando perché non c'è polimorfismo in C, che non c'è niente da fare in fase di esecuzione. Cioè, la risposta a typeof è nota al momento della compilazione. (Non riesco a pensare a un uso di typeof che non sarebbe noto in fase di compilazione.) Quindi sembra essere più di una direttiva in fase di compilazione, che un operatore.tipo di operatore in C

Il tipo di utilizzo di qualsiasi runtime (processore) (in GCC)?

+17

C non ha un operatore 'typeof', ovvero un'estensione del compilatore. –

risposta

37

Poiché typeof è un'estensione del compilatore, non esiste realmente una definizione per esso, ma nella tradizione di C sarebbe un operatore, ad esempio sizeof e _Alignof sono anche visti come operatori.

E si è sbagliato, C ha tipi dinamici che sono determinati solo in fase di esecuzione: variabili modificate (VM).

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

può essere determinato solo in fase di esecuzione.

+11

Non abbiate paura di collegarvi a [fonti interessanti] (http://gustedt.wordpress.com/2011/01/09/dont-be-afraid-of-variably-modified-types/) riguardo questo argomento :) –

+1

@NikolaiRuhe, non ci avrei pensato come risorsa principale per i tipi di macchine virtuali ... ma se lo dici tu :) –

+0

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

3

non è esattamente un operatore, piuttosto una parola chiave. E no, non fa magie runtime.

+0

Motivo per i downvotes? –

23

È un'estensione GNU. In poche parole è un modo conveniente per dichiarare un oggetto che ha lo stesso tipo di un altro. Per esempio:

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

E funziona interamente al momento della compilazione ed è utilizzato prevalentemente nelle macro. Un famoso esempio di macro basato su typeof è container_of.

+4

Non penso che funzioni interamente alla compilazione, anche se devo ammettere che non ho controllato: penso che funzioni anche per VLA e altri tipi di VM. Quindi questo può essere determinato solo in fase di esecuzione. –

+0

@JensGustedt Hai ragione. – cnicutar