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
.
fonte
2012-01-13 16:20:08
Grazie mille che ha perfettamente senso. –
... e forse 'const * S1CPTR'. – alecov
Giusto per confermare, capisco. È equivalente a 'typedef struct {...} S1; typedef S1 * S1PTR; '? – DCShannon