Udostępnij za pośrednictwem


Deklaracje typedef

Deklaracja typedef jest deklaracją z typedef jako klasą magazynu. Deklarator staje się nowym typem. Deklaracje typedef umożliwiają konstruowanie krótszych lub bardziej znaczących nazw typów zdefiniowanych przez język C lub dla zadeklarowanych typów. Nazwy zdefiniowane przez typedef pozwalają na hermetyzację szczegółów implementacji, które mogą się zmieniać.

Deklaracja typedef jest interpretowana w taki sam sposób jak zmienna lub deklaracja funkcji, ale identyfikator, zamiast zakładać typ określony przez deklarację, staje się synonimem typu.

Składnia

declaration:
declaration-specifiersinit-declarator-listZdecydować;

declaration-specifiers:
storage-class-specifierdeclaration-specifiersZdecydować
type-specifierdeclaration-specifiersZdecydować
type-qualifierdeclaration-specifiersZdecydować

storage-class-specifier:
typedef

type-specifier:
void
char
short
int
long
float
double
signed
unsigned
struct-or-union-specifier
enum-specifier
typedef-name

typedef-name:
identifier

Deklaracja typedef nie tworzy nowych typów. Tworzy synonimy dla istniejących typów lub nazw typów, które można określić na inne sposoby. Gdy nazwa typedef jest używana jako specyfikator typu, można ją połączyć z określonymi specyfikatorami typów, ale nie innymi. Dozwolone modyfikatory obejmują const i volatile.

Nazwy typedef współdzielą przestrzeń nazw ze zwykłymi identyfikatorami. (Aby uzyskać więcej informacji, zobacz Przestrzenie nazw). W związku z tym program może mieć nazwę typedef i identyfikator zakresu lokalnego o tej samej nazwie. Na przykład:

typedef char FlagType;

int main()
{
}

int myproc( int )
{
    int FlagType;
}

W przypadku deklarowania identyfikatora zakresu lokalnego o tej samej nazwie co typedef lub deklarowania elementu członkowskiego struktury lub unii w tym samym zakresie lub w zakresie wewnętrznym należy również określić specyfikator typu. W tym przykładzie pokazano 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 ponownie deklarowany. Taką deklarację uważa się za niedozwoloną, tak jak

int;  /* Illegal declaration */

Można zadeklarować dowolny typ za pomocą typedefpolecenia , w tym wskaźnika, funkcji i typów tablic. 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.

Nazwy typedef mogą służyć do poprawy czytelności kodu. Wszystkie trzy z poniższych signal deklaracji określają dokładnie ten sam typ, pierwszy bez używania 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

W poniższych przykładach przedstawiono deklaracje typedef:

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

Na przykład można go użyć w deklaracji zmiennej, WHOLE takiej jak WHOLE i; lub const WHOLE i;. Jednak deklaracja long WHOLE i; byłaby nielegalna.

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

Ta instrukcja deklaruje GROUP jako typ struktury z trzema elementami członkowskimi. Ponieważ tag struktury, club, jest również określony, nazwa typedef (GROUP) lub tag struktury może być używany w deklaracjach. Musisz użyć słowa kluczowego struct z tagiem i nie można użyć struct słowa kluczowego z nazwą typedef.

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

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

typedef void DRAWF( int, int );

W tym przykładzie przedstawiono typ DRAWF funkcji, która nie zwraca żadnej wartości i przyjmuje dwa argumenty int. Oznacza to na przykład, że deklaracja

DRAWF box;

jest odpowiednikiem deklaracji

void box( int, int );

Zobacz też

Deklaracje i typy