non sono sicuro se sarebbe del tutto corretta in C++ standard, ma ho provato con g++ -pedantic -Wall
e non ho ricevuto errori o avvisi (notare che questo doesn' significa necessariamente che è completamente standard. g ++, anche con -pedantic, non passa attraverso il problema di dare un avvertimento per tutto il codice non standard.) (Qualcuno conosce le specifiche del C++ abbastanza bene da commentare se è effettivamente standard o no? ?)
La cosa con la scrittura:
struct person person = {...};
è che in C++, person
si riferisce sia alla variabile che al tipo. In C, questo non era un problema semplicemente perché person
non è il tipo (struct person
è). Sebbene dal contesto, con i pochi test che ho scritto con g ++, il compilatore non ha avuto problemi a capire quando chiedo la variabile e quando per il tipo, penso che a un certo punto potrebbe confondersi. Una cosa di confusione che ho scoperto è che se si dispone di:
struct person *person = ...;
poi sizeof(person)
restituisce la dimensione della variabile, mentre per ottenere la dimensione del tipo, si dovrebbe scrivere sizeof(struct person)
che vi posso assicurare, non C++ coder ricorderei di scrivere lo stuct
.
È meglio evitare ogni tipo di confusione. Io di solito faccio per il codice che potrebbe essere utilizzato sia in C e C++:
typedef struct person
{
...
} person;
Dare un nome alla struct che si sta typedef
ndr permette al programmatore di utilizzare uno o person
struct person
. Quindi, un po 'di flessibilità (per non parlare del fatto che non è necessario modificare il codice già scritto dopo lo typedef
ineo struct
.
Non direi che "proprietà interessante" è piuttosto oscura proprietà. È meglio mantenere i nomi dei tipi a partire da maiuscole per distinguere i nomi dei tipi e delle variabili. –
L'ho contrassegnato come duplicato di [typedef struct vs struct definition] (http://stackoverflow.com/questions/1675351/typedef-struct-vs-struct-definitions). Tecnicamente puoi considerare che non lo è (l'altra domanda riguarda solo C) ma la semantica è la stessa in C++ con la sola differenza che la ricerca troverà anche i simboli nello spazio identificatore definito dall'utente se non li trova nel spazio identificativo globale. Anche questo viene trattato nella risposta accettata (che contiene bit di C++) –
Inoltre, sono ** non ** due modi di definire una 'struct', c'è un unico modo per definire una' struct' (che può avere o non un nome), e ci sono 'typedef's (che possono essere applicati a un tipo con o senza nome), ma non sono in alcun modo due modi per definire una' struct'. E ti mancano 3), combinando entrambi: 'typedef struct type {} type;' per quello che vale (che è il modo idiatico C) –