2015-04-23 34 views
6

ho avuto questa implementazione di una struttura:Typedef equivalenza per un puntatore a struct

struct NodoQ { 
    Etype elem; 
    NodoQ *sig; 
}; 

È questo il codice qui sotto,

typedef NodoQ *PtrNodoQ; 
PtrNodoQ ppio, fin; 

lo stesso come questo?

NodoQ* ppio; 
NodoQ* fin; 
+0

Sì, sono uguali. –

+0

Penso di sì, ma perché non chiedi al compilatore? –

+0

Non ho provato perché ho ottenuto la seconda opzione in tutto il codice e non volevo perdere tempo ... quindi quando si utilizza typodef NodoQ * PtrNodoQ. PtrNodoQ diventa un alias di NodoQ * Immagino sia un modo per evitare il '*' e una migliore leggibilità ... grazie Michael e Mark – HoNgOuRu

risposta

6

È questo il codice qui sotto,

typedef NodoQ *PtrNodoQ; 
PtrNodoQ ppio, fin; 

lo stesso come questo?

NodoQ* ppio; 
NodoQ* fin; 

Sì, è conseguente esattamente gli stessi tipi di puntatore per ppio e fin.


Per quanto riguarda il tuo commento

"Non ho provato perché ho avuto la seconda opzione ovunque nel mio codice, e non volevo perdere un po 'di tempo ..."

si può facilmente verificare che:

void foo(PtrNodoQ p) { 
} 

void bar(NodoQ* p) { 
    foo(p); 
} 

e

void baz() { 
    NodoQ n; 
    foo(&n); 
    bar(&n); 
} 

compilazione tutto perfettamente bene, senza avvisi di conversione di tipo non validi o errori.


Inoltre si potrebbe avere trovato la risposta rapidamente this excellent reference (sottolineatura mia):

typedef-nomi sono alias per i tipi esistenti, e sono non dichiarazioni di nuovi tipi di. Typedef non può essere utilizzato per modificare il significato di un nome di tipo esistente (incluso un typedef-name). Una volta dichiarato, un nome typedef può essere redeclared per riferirsi nuovamente allo stesso tipo. I nomi typedef hanno effetto solo nello scope in cui sono visibili: diverse funzioni o dichiarazioni di classe possono definire tipi con nomi identici con significato diverso.

+0

Il fatto che compili non indica che i tipi sono identici, poiché potrebbero essere applicate conversioni automatiche. Preferisco la risposta che cita lo standard. –

+0

@MarkRansom _ "poiché potrebbero essere applicate conversioni automatiche" _ La struttura 'NodoQ' dell'OP non indica in alcun modo tale. Ma sì, preferisco anche l'altra risposta, ecco perché l'ho svalutato come prima :) –

+0

Lo so, come te, che non ci sono state conversioni. Tutto quello che volevo sottolineare è che lo snippet di codice che hai fornito non poteva * dimostrarlo *. Le conversioni implicite tra tipi correlati avvengono continuamente. Non posso lamentarmi troppo, però non avevo alcuna prova. –

3

Nel caso in cui si voleva lo standardese, [dcl.typedef] afferma che:

Un nome dichiarato con la typedef identificatore diventa un typedef-name. Nell'ambito della sua dichiarazione, un nome-typedef è sintatticamente equivalente ad una parola chiave e nomi il tipo associato con l'identificatore modo descritto nella Clausola 8. typedef-nameè quindi un tradurre per un altro tipoA typedef-namefa non introdurre un nuovo tipo come fa una dichiarazione di classe (9.1) o una dichiarazione enum. [Esempio: dopo

typedef int MILES, *KLICKSP; 

costruzioni

MILES distance; 
extern KLICKSP metricp; 

sono tutte le dichiarazioni corrette; il tipo di distance è int e quello di metricp è “puntatore a int.” -end esempio]

Nel tuo caso, dopo

typedef NodoQ *PtrNodoQ; 

I tipi PtrNodoQ e Node* sono esattamente gli stesso e può essere usato in modo intercambiabile da lì in poi. Le dichiarazioni NodoQ* ppio; e PtrNodoQ ppio; sono esattamente equivalenti.

Problemi correlati