2009-10-09 16 views
34

mi ero imbattuto il seguente codice:C typedef di puntatore a strutturare

typedef struct { 
     double x; 
     double y; 
     double z; 
} *vector; 

Si tratta di una definizione di tipo valida? Il codice viene compilato e funziona correttamente. Ero solo curioso di sapere se questa è una pratica comune.

risposta

51

Assolutamente valido. solito, è possibile sfruttare al massimo questo modo da definire due tipi insieme:

typedef struct 
{ 
int a; 
int b; 
} S1, *S1PTR; 

Dove S1 è una struct e S1PTR è il puntatore a questa struct.

+1

Grazie mille che ha perfettamente senso. –

+0

... e forse 'const * S1CPTR'. – alecov

+0

Giusto per confermare, capisco. È equivalente a 'typedef struct {...} S1; typedef S1 * S1PTR; '? – DCShannon

-2

sì ... ti risparmia il problema di digitare costantemente la parola "struct" ogni volta che dichiari la struttura vettoriale o un puntatore.

+1

Penso che la domanda doveva fare di più con il typedef'ing su * vector piuttosto che sul vettore. –

2

È valido, quello che fa è definire un nuovo tipo. Come ha detto @Alex, sarebbe utile definire un tipo e un tipo di puntatore.

è possibile creare più puntatori semplicemente utilizzando

S1PTR ptr1, ptr2, ptr3, ...; 

invece di

S1 *ptr1, *ptr2, *ptr3, ...; 
3

Sì, è valida. Se avete bisogno di più "sicurezza" si può anche fare

typedef struct vector_{ 
     double x; 
     double y; 
     double z; 
} *vector; 

quindi è possibile utilizzare sia

struct vector_ *var; 
vector var; 

ma non dimenticare il finale punto e virgola.

Utilizzare solo typedef significa che lo si chiami in questo modo. altrimenti sarebbe più o meno anonimo.

+1

Credo che sia possibile utilizzare lo stesso nome per entrambi (vale a dire, non è necessario il carattere di sottolineatura, ma è possibile lasciare tutto il resto nel codice allo stesso modo, perché gli spazi dei nomi sono separati). – RastaJedi

1

Sì, è valido come descritto nelle risposte precedenti. Un piccolo suggerimento, sarebbe meglio se fornisci anche un nome di tag, come segue. Ciò aiuterebbe alcuni IDE a meglio analizzare il tuo codice.

typedef struct vactor_tag { 
     double x; 
     double y; 
     double z; 
} *vector; 
24

Sì, lo è. Ma è imho pessimo stile. Non la dichiarazione diretta della struct, ma la dichiarazione diretta di un tipo di puntatore. È l'offuscamento, l'informazione che una determinata variabile o parametro è un puntatore (e in misura minore per gli array) è estremamente importante quando si vuole leggere il codice.

Durante la revisione del codice è spesso difficile vedere a prima vista quale funzione potrebbe avere un effetto collaterale o meno. Se i tipi usati nascondono queste informazioni, aggiungono un carico di memorizzazione al lettore.

int do_fancy(vector a, vector b); 

o

int do_fancy(vector *a, vector *b); 

nel primo caso posso mancare facilmente che tale funzione può modificare il contenuto di una o b. Nel secondo sono avvisato.

E quando si scrive codice in realtà so anche direttamente scrivere a->x e non avere il compilatore dirmi error: request for member x 'in qualcosa non una struttura o unione`.

Lo so, sembra una cosa di gusto personale, ma avendo lavorato con un sacco di codice esterno, posso assicurarvi che è estremamente fastidioso quando non si riconosce il livello di variabili indirette. Questa è una delle ragioni per cui non mi piacciono i riferimenti C++ (in Java non è perché tutti gli oggetti sono passati per riferimento, è coerente) e il tipo di tipi di Microsoft LPCSTR.

+6

+1 per l'osservazione che 'typedef struct {...} * obj' conduce a un tipo che richiede misteriosamente' -> 'invece di' .' per l'accesso agli elementi. – Michael