Questa domanda nasce dalla domanda Is a struct {...}; a type or an unnamed variable?Legalità del `typedef struct foo {int bar};`
In questa domanda, il PO ha chiesto circa
typedef struct student_s {
char* name;
int age;
double height;
struct student_s* next;
};
sto chiedendo circa la legittimità di quanto sopra . È necessaria una diagnostica quando il codice che contiene quanto sopra è compilato (o per semplificare, typedef struct foo {int bar;};
)?
La mia opinione è che è legale, che non è richiesta una diagnosi dal punto di vista di un avvocato linguistico. (A parte: non sto sostenendo di utilizzare questo è molto degno di una diagnosi Mi piacerebbe molto desidera che il compilatore di avvertirmi se ho erroneamente scritto il codice come sopra...)
Sezione 6.7 dello standard C11 detta la sintassi di una dichiarazione: dichiarazione-identificatori init-declarator-list opt;
Si noti che la lista di avvio-dichiarazione è facoltativa. Ciò potrebbe indurre a pensare che typedef int;
sia valido. Non è perché lo standard dice anche che
Una dichiarazione diversa da una dichiarazione static_assert deve dichiarare almeno un dichiaratore (diverso dai parametri di una funzione o dei membri di una struttura o unione), un tag, o i membri di un'enumerazione.
Così typedef int;
e typedef struct {int bar};
sono illegali perché non dichiarano un dichiaratore, un tag, o un membro di un'enumerazione.
D'altra parte, mi sembra che typedef struct foo {int bar;};
sia legale perché dichiara qualcosa. In particolare, dichiara e definisce il tag struct
foo
.
Il ragionamento sopra è corretto?
Penso che dichiara '{int bar; } ', non puoi fare nulla di utile con esso. – this
@David Hammen Non c'è un dichiaratore in questo typedef. –
@questo: lo standard (vedere la mia citazione nella domanda) esclude specificamente i membri di una struttura o unione. Quindi 'typedef struct {int bar;};' è illegale. –