2012-07-08 10 views
8

Ho la seguente dichiarazione in un file di intestazione:typedef con un effetto collaterale di dichiarazione diretta?

struct my_struct; 
int func(struct my_struct* s);  // Passing struct my_struct* 

Senza la dichiarazione anticipata, il compilatore sarebbe ovviamente dare this error:

error: 'struct my_struct' declared inside parameter list

Tuttavia, se si sostituisce la inoltra la dichiarazione di my_struct con un typedef e aggiorna la dichiarazione di funzione di conseguenza, è compiles fine:

typedef struct my_struct my_struct_t; 
int func(mystruct_t* s);    // Passing my_struct_t* 

Curiosamente, se tengo il typedef, ma utilizzare la dichiarazione originale my_struct, è also compiles:

typedef struct my_struct my_struct_t; 
int func(struct my_struct* s);  // Passing struct my_struct* 

Ha fatto chiunque altro notato? Questo comportamento è un effetto collaterale?

+2

Il typedef funge anche da dichiarazione diretta, porta il nome del tipo in ambito. –

+0

@DanielFischer Sì, l'ho notato :) ma non sono riuscito a trovare nulla nello standard che lo affermasse. Ho dimenticato qualcosa? –

+0

Non è necessaria una dichiarazione diretta per creare un puntatore a una struttura. È solo una convenzione. Ho sbagliato? –

risposta

7

cui al punto 6.2.1, comma 7:

Struttura, l'unione, e di enumerazione tag hanno portata che inizia subito dopo la comparsa di del tag in un tipo specifico er fi che dichiara il tag. Ogni costante di enumerazione ha uno scope che inizia subito dopo la comparsa del suo enumeratore di definizione in un elenco di elenchi di numeratori. Qualsiasi altro identificatore ha uno scope che inizia subito dopo il completamento del suo dichiaratore.

E in 6.7.2.3, paragrafo 8:

Se un tipo di speci fi catore della forma struct-o-union identi fi catore si verifica se non come parte di una delle forme di cui sopra, e non un'altra dichiarazione dell'identificatore come un tag è visibile, quindi dichiara una struttura incompleta o un tipo di unione e dichiara l'identificatore come il tag di quel tipo.

Il typedef dichiara pertanto un tipo di struttura incompleto.

+0

+1 Bello! Molte grazie! –

Problemi correlati