Deklaracje typedef
Deklaracja typedef jest deklaracją z typedef jako klasą magazynu. Deklarator staje się nowym typem. Za pomocą deklaracji typedef można tworzyć krótsze lub bardziej znaczące nazwy typów zdefiniowanych już 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 przy założeniu typu określonego przez deklarację, staje się synonimem typu.
Składnia
declaration
:
declaration-specifiers
init-declarator-list
Zdecydować ;
declaration-specifiers
:
storage-class-specifier
declaration-specifiers
Zdecydować
type-specifier
declaration-specifiers
Zdecydować
type-qualifier
declaration-specifiers
Zdecydować
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ć w inny sposób. Gdy nazwa definicji typu jest używana jako specyfikator typu, można ją połączyć z określonymi specyfikatorami typów, ale nie innymi. Dopuszczalne 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 takiej samej nazwie jak 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ą typedef
polecenia , 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 teraz użyć w deklaracji zmiennej, WHOLE
takiej jak WHOLE i;
lub const WHOLE i;
. Deklaracja long WHOLE i;
byłaby jednak 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ć struct
słowa kluczowego z tagiem i nie można użyć struct
słowa kluczowego o nazwie typedef.
typedef GROUP *PG; /* Uses the previous typedef name
to declare a pointer */
Typ PG
jest deklarowany 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 );