Niente di tutto questo vale per C++
. In C++
preferiscono:
struct Foo
{
. . .
};
Il resto si applica solo ai C
.
Tecnicamente struct Foo {};
è sufficiente per la maggior parte degli scopi. Tuttavia è un po 'prolisso da utilizzare come struct
deve essere ripetuto ogni volta che si usa il tipo Foo.
struct Foo {}
void func(struct Foo* foo);
Un typedef rende questo più semplice.
struct Foo { };
typedef struct Foo Foo;
void func(Foo* foo);
Questo può essere ulteriormente accorciato con:
typedef struct Foo { } Foo;
void func(Foo* foo);
Quando si effettua un uno di linea è anche possibile utilizzare la seguente sintassi:
typedef struct { } Foo;
void func(Foo* foo);
Questa è la creazione di un anonimo struct
e poi dare è il nome Foo. Lo vedi più spesso con enum
s.
typedef enum { } Bar;
C'è una ragione per cui il licenziamento ridondante iniziale viene di solito lasciato lì. È solo un modo per creare una struttura autoreferenziale, come una lista collegata.
typedef struct Node
{
Node* next;
} Node;
Se l'iniziale Node
dove ommited non ci sarebbe alcun modo per dichiarare un puntatore alla struttura. Tecnicamente vale anche questo, ma ora devi inventare 2 nomi, invece di uno solo.
typedef struct node_
{
node_* next;
} Node;
Allora, perché l'uso:
typedef struct Foo { } Foo;
Per uniformità. Questo stile di dichiarazione copre tutte le basi, quindi non devi mai pensarci quando dichiari una struttura.
Ecco C, C++ non è. Sei sicuro di fare riferimento alla lingua giusta? –
C o C++, nessuna differenza in questo esempio. Cerca typedef su google o nei tuoi libri. –
@gbrandt: Sì, ma non c'è motivo di dichiarare una struttura in questo modo in C++. –