Sdílet prostřednictvím


Deklarace struktury

Deklarace struktury pojmenuje typ a určuje sekvenci proměnných hodnot (označovaných jako "členy" nebo "pole" struktury), která může mít různé typy. Volitelný identifikátor, kterému se říká značka, dává název typu struktury a lze jej použít v následných odkazech na typ struktury. Proměnná tohoto typu struktury obsahuje celou sekvenci definovanou tímto typem. Struktury v jazyce C jsou podobné typům, které se v jiných jazycích označují jako "záznamy".

Syntaxe

struct-or-union-specifier:
struct-or-unionidentifiervolit { struct-declaration-list }
struct-or-union identifier

struct-or-union:
struct
union

struct-declaration-list:
struct-declaration
struct-declaration-list struct-declaration

struct-declaration:
specifier-qualifier-list struct-declarator-list ;

specifier-qualifier-list:
type-specifierspecifier-qualifier-listvolit
type-qualifierspecifier-qualifier-listvolit

struct-declarator-list:
struct-declarator struct-declarator-list , struct-declarator

struct-declarator:
declarator
type-specifierdeclaratorvolit : constant-expression

Deklarace typu struktury neukládá prostor pro strukturu. Jedná se pouze o šablonu pro pozdější deklarace proměnných struktury.

Dříve definovaná identifier (značka) se dá použít k odkazování na typ struktury definovaný jinde. V tomto případě se nedá opakovat, struct-declaration-list pokud je definice viditelná. Deklarace ukazatelů na struktury a typedefs pro typy struktur mohou použít značku struktury před definováním typu struktury. Definice struktury však musí být zjištěna před jakýmkoli skutečným použitím velikosti polí. Toto použití je neúplná definice typu a značky typu. Aby byla tato definice dokončena, musí se definice typu objevit později ve stejném oboru.

Určuje struct-declaration-list typy a názvy členů struktury. Argument struct-declaration-list obsahuje jednu nebo více deklarací proměnných nebo bitových polí.

Každá proměnná deklarovaná v struct-declaration-list je definována jako člen typu struktury. Deklarace proměnných v rámci struct-declaration-list mají stejný formulář jako jiné deklarace proměnných probírané v této části s tím rozdílem, že deklarace nemohou obsahovat specifikátory třídy úložiště nebo inicializátory. Členy struktury mohou mít libovolné typy proměnných kromě typu void, neúplného typu nebo typu funkce.

Člen nemůže být deklarován tak, aby měl typ struktury, ve které se zobrazuje. Člen lze však deklarovat jako ukazatel na typ struktury, ve kterém se zobrazuje, pokud typ struktury má značku. Umožňuje vytvářet propojené seznamy struktur.

Struktury se řídí stejným oborem jako jiné identifikátory. Identifikátory struktury se musí lišit od jiných značek struktury, sjednocení a výčtu se stejnou viditelností.

Každý struct-declaration v struct-declaration-list seznamu musí být jedinečný. Názvy identifikátorů se struct-declaration-list ale nemusí lišit od běžných názvů proměnných ani od identifikátorů v jiných seznamech deklarací struktury.

K vnořeným strukturám lze přistupovat také tak, jako kdyby byly deklarovány na úrovni oboru souboru. Například vzhledem k této deklaraci:

struct a
{
    int x;
    struct b
    {
      int y;
    } var2;
} var1;

tyto deklarace jsou obě právní:

struct a var3;
struct b var4;

Příklady

Tyto příklady znázorňují deklarace struktury:

struct employee   /* Defines a structure variable named temp */
{
    char name[20];
    int id;
    long class;
} temp;

Struktura employee má tři členy: name, ida class. Člen name je pole s 20 prvky a id class jsou jednoduché členy s int a long typem. Identifikátor employee je identifikátor struktury.

struct employee student, faculty, staff;

Tento příklad definuje tři proměnné struktury: student, facultya staff. Každá struktura má stejný seznam tří členů. Členové jsou deklarovány, že mají typ employeestruktury , definovaný v předchozím příkladu.

struct           /* Defines an anonymous struct and a */
{                /* structure variable named complex  */
    float x, y;
} complex;

Struktura complex má dva členy s typem float x a y. Typ struktury nemá žádnou značku a proto není pojmenován nebo anonymní.

struct sample   /* Defines a structure named x */
{
    char c;
    float *pf;
    struct sample *next;
} x;

První dva členy struktury jsou proměnná char a ukazatel na float hodnotu. Třetí člen , nextje deklarován jako ukazatel na typ struktury, který je definován (sample).

Anonymní struktury můžou být užitečné, když název značky není potřeba, například když jedna deklarace definuje všechny instance struktury. Příklad:

struct
{
    int x;
    int y;
} mystruct;

Vložené struktury jsou často anonymní.

struct somestruct
{
    struct    /* Anonymous structure */
    {
        int x, y;
    } point;
    int type;
} w;

Specifické pro Microsoft

Kompilátor umožňuje, aby pole bez velikosti nebo nulové velikosti bylo posledním členem struktury. Je užitečné, pokud se velikost konstantního pole liší při použití v různých situacích. Deklarace takové struktury vypadá takto:

struct identifier { set-of-declarations type array-name []; };

Nesized arrays can appear only as the last member of a structure. Struktury obsahující nesized maticové deklarace lze vnořit do jiných struktur, pokud žádné další členy nejsou deklarovány v jakýchkoli uzavřených strukturách. Pole takových struktur nejsou povolená. Operátor sizeof při použití na proměnnou tohoto typu nebo na samotný typ předpokládá hodnotu 0 pro velikost pole.

Deklarace struktury lze také zadat bez deklarátoru, pokud jsou členy jiné struktury nebo sjednocení. Názvy polí jsou povýšeny do ohraničující struktury. Například struktura bez názvů vypadá takto:

struct s
{
    float y;
    struct
    {
        int a, b, c;
    };
    char str[10];
} *p_s;
.
.
.
p_s->b = 100;  /* A reference to a field in the s structure */

Další informace o odkazech na strukturu naleznete v tématu Struktura a členové sjednocení.

END Microsoft Specific

Viz také

Deklarátor a deklarace proměnné