Udostępnij za pośrednictwem


Deklaracje typedef

Deklaracja typedef jest deklaracją z typedef, jako klasą magazynowania.Oświadczenie staje się nowym typem.Deklaracji typedef można używać do tworzenia krótszych, bardziej znaczących nazw typów już zdefiniowanych przez język C lub zdefiniowanych ręcznie.Nazwy zdefiniowane przez typedef pozwalają na hermetyzację szczegółów implementacji, które mogą się zmieniać.

Deklaracja elementu typedef jest interpretowana w taki sam sposób jak zmienna lub deklaracja funkcji, ale identyfikator zamiast uznać typ określony w deklaracji, staje się synonimem typu.

Składnia

  • declaration:
    declaration-specifiers init-declarator-list opt**;**

  • declaration-specifiers:
    storage-class-specifier declaration-specifiers opt

    type-specifier declaration-specifiers opt

    type-qualifier declaration-specifiers opt

  • storage-class-specifier:
    typedef

  • type-specifier :
    pusty

    char

    short

    int

    long

    typ float

    double

    oznaczony

    nieoznaczony

    struct-or-union-specifier

    enum-specifier

    typedef-name

  • typedef-name:
    identifier

Uwaga, deklaracja elementu typedef nie powoduje utworzenia typów.Tworzy synonimy dla istniejących typów lub nazwy dla typów, które mogą być określone w inny sposób.Kiedy nazwa elementu typedef jest używana, jako specyfikator typu, można łączyć niektóre specyfikatory typu, ale innych nie.Dopuszczalne modyfikatory obejmują const i volatile.

Nazwy typedef współużytkują przestrzeń nazw z zwykłymi identyfikatorami (zobacz Przestrzenie nazw, aby uzyskać więcej informacji).Program może mieć więc nazwę typedef i identyfikator o zakresie lokalnym o tej samej nazwie.Na przykład:

typedef char FlagType;

int main()
{
}

int myproc( int )
{
    int FlagType;
}

Podczas deklarowania identyfikatora o zakresie lokalnym o tej samej nazwie co element typedef lub podczas deklarowania elementu struktury lub unii w tym samym zakresie lub w zakresie wewnętrznym, należy określić specyfikatora typu.Ten przykład ilustruje to ograniczenie:

typedef char FlagType;
const FlagType x;

Aby ponownie użyć nazwy FlagType dla identyfikatora, elementu struktury lub unii musi zostać dostarczony typ:

const int FlagType;  /* Type specifier required */

Nie wystarczy powiedzieć

const FlagType;      /* Incomplete specification */

ponieważ FlagType uważa się za część typu, a nie identyfikatora, który jest jest ponownie deklarowany.Taką deklarację uważa się za niedozwoloną, tak jak

int;  /* Illegal declaration */

Można zadeklarować dowolny typ z typedef, w tym wskaźnik, funkcję i typy tablicowe.Można zadeklarować nazwę typedef wskaźnika na strukturę lub unię przed zdefiniowaniem struktury lub unii, tak długo jak definicja ma taką samą widoczność jak deklaracja.

Nazwa typedef może służyć do zwiększenia czytelności kodu.Wszystkie trzy następujące deklaracje signal, określają dokładnie ten sam typ, pierwsza nie używa nazw typedef.

typedef void fv( int ), (*pfv)( int );  /* typedef declarations */

void ( *signal( int, void (*) (int)) ) ( int );
fv *signal( int, fv * );   /* Uses typedef type */
pfv signal( int, pfv );    /* Uses typedef type */

Przykłady

Poniższe przykłady ilustrują deklaracje typedef:

typedef int WHOLE; /* Declares WHOLE to be a synonym for int */

Należy zauważyć, że WHOLE może teraz być używany w deklaracji zmiennych, takich jak WHOLE i; lub const WHOLE i;.Jednak, deklaracja long WHOLE i; może być niedozwolona.

typedef struct club 
{
    char name[30];
    int size, year;
} GROUP;

Ta instrukcja deklaruje GROUP, jako typ struktury z trzema elementami członkowskimi.Rozpoczynając od struktury tagu club, również jest określony, nazwa elementu typedef (GROUP) lub znacznik struktury tag, może być używany w deklaracji.Należy użyć słowa kluczowego struct ze znacznikiem tag i nie można użyć słowa kluczowego struct z nazwą typedef.

typedef GROUP *PG; /* Uses the previous typedef name 
                      to declare a pointer            */

Typ PG jest zadeklarowany, jako wskaźnik do typu GROUP, który z kolei jest zdefiniowany, jako typ struktury.

typedef void DRAWF( int, int );

W tym przykładzie podano typ DRAWF dla funkcji niezwracającej wartości i przyjmującej dwa argumenty typu int.Oznacza to na przykład, że deklaracja

DRAWF box; 

jest równoważna deklaracji

void box( int, int );

Zobacz też

Informacje

typedef — specyfikator