2014-11-03 12 views
5

Jaka jest różnica między tymi dwoma deklaracji w C:Jaka jest różnica między `typedef struct X {}` a `typedef struct {} X`?

typedef struct square{ 

    //Some fields 

}; 

i

typedef struct{ 

      //Some fields 

} square; 
+0

Wiem, mam pewne pola w mojej strukturze, po prostu muszę znać różnicę nazwy na dole i górze struktury ... – PlayHardGoPro

+0

Możliwy duplikat [Dlaczego powinniśmy typedef struct tak często w C?] (http://stackoverflow.com/questions/252780/why-should-we-typedef-a-ctct-so-often-in-c) – Raedwald

Odpowiedz

10

Pierwsza deklaracja:

typedef struct square { 
    // Some fields 
}; 

definiuje typ nazwie struct square. Słowo kluczowe typedef jest zbędne (dzięki HolyBlackCat za wskazanie tego). Jest to równoznaczne z:

struct square { 
    //Some fields 
}; 

(Fakt, że można użyć typedef słowa kluczowego w deklaracji bez definiowania nazwy typu jest usterka w składni C Użytkownika).

Ta pierwsza deklaracja prawdopodobnie powinny zostały :

typedef struct square { 
    // Some fields 
} square; 

druga deklaracja:

typedef struct { 
    // Some fields 
} square; 

definiuje anonimowy typ struct, a następnie nadaje mu alias square.

Należy pamiętać, że sama nazwa typedef nie definiuje nowego typu, a jedynie nową nazwę istniejącego typu. W tym przypadku definicja typedef i (anonimowa) struct jest łączona w jedną deklarację.

+3

Również w pierwszym przypadku 'typedef' jest zbędny i nie robi nic. – HolyBlackCat

+0

@HolyBlackCat: Całkowicie tego nie zauważyłem. Dzięki. –

+0

Dziękujemy! Naprawdę pomogło! – PlayHardGoPro

2
struct X { /* ... */ }; 

To tworzy nowy typ. Więc można zadeklarować ten nowy typ przez

struct X myvar = {...} 

lub

struct X *myvar = malloc(sizeof *myvar); 

typdef ma wymienić typ

typedef enum { false, true } boolean; 
boolean b = true; /* Yeah, C ANSI doesn't provide false/true keyword */ 

więc tu, przemianowany enum do Boolean.

Więc kiedy piszesz

typedef struct X { 
    //some field 
} X; 

zmienić nazwę typu struct X X. Kiedy powiedziałem, zmiana nazwy, to im bardziej inna nazwa.

Porady, można po prostu napisać:

typedef struct { 
    //some field 
} X; 

Ale jeśli potrzebujesz pola tego samego typu (jak w połączonej listy) trzeba było nadać nazwę swojej struktury

typedef struct X { 
    X *next; /* will not work */ 
    struct X *next; /* ok */ 
} X; 

Nadzieja to pomaga :)

Edit: Jak powiedział Keith Thompson, typdef jest stworzenie aliasu :)

Powiązane problemy