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;
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;
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ę.
Również w pierwszym przypadku 'typedef' jest zbędny i nie robi nic. – HolyBlackCat
@HolyBlackCat: Całkowicie tego nie zauważyłem. Dzięki. –
Dziękujemy! Naprawdę pomogło! – PlayHardGoPro
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 :)
Wiem, mam pewne pola w mojej strukturze, po prostu muszę znać różnicę nazwy na dole i górze struktury ... – PlayHardGoPro
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