2012-07-08 11 views
8

Mam następującą deklarację w pliku nagłówka:typedef z dodatkowym efektem ubocznym deklaracji?

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

bez deklaracji przodu, kompilator będzie oczywiście dać this error:

error: 'struct my_struct' declared inside parameter list

Jednakże, jeśli zastąpi Prześlij deklarację my_struct z typedef i zaktualizuj odpowiednio deklarację funkcji, to compiles fine:

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

Co ciekawe, jeśli trzymam typedef, ale używać oryginalnego oświadczenia my_struct, to also compiles:

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

Czy ktokolwiek zauważy, że? Czy to zachowanie jest efektem ubocznym?

+2

Typedef działa również jako deklaracja do przodu, przenosi nazwę typu do zakresu. –

+0

@ DanielFischer Tak, zauważyłem, że :) ale nie mogłem znaleźć niczego w standardowym stwierdzeniu, że. Przegapiłem coś? –

+0

Nie ma potrzeby deklaracji przekazania do utworzenia wskaźnika do struktury. To tylko konwencja. Czy się mylę? –

Odpowiedz

7

w sekcji 6.2.1, pkt 7:

konstrukcja, unia, a wyliczenie znaczniki mają zakres, który rozpoczyna się tuż po pojawieniu tag w typie specy fi er, który deklaruje tag. Każda stała wyliczeniowa ma zasięg, który rozpoczyna się tuż po pojawieniu się jego modułu wyliczającego na liście wyliczeniowej. Każdy inny identyfikator ma zakres, który rozpoczyna się tuż po zakończeniu deklaracji.

A w 6.7.2.3, pkt 8:

Jeśli typ specy fi er formularza struct-or-unia identy fi er występuje inny niż w ramach jednej z powyższych form, a nie inna deklaracja identyfikatora jako znacznika jest widoczna, następnie deklaruje niekompletną strukturę lub typ połączenia, a deklaruje identyfikator jako znacznik tego typu.

W ten sposób typedef deklaruje niekompletny typ konstrukcji.

+0

+1 Piękny! Wielkie dzięki! –

Powiązane problemy