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 opttype-specifier declaration-specifiers opt
type-qualifier declaration-specifiers opt
storage-class-specifier:
typedeftype-specifier :
pustychar
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 );