Typedef – deklarace
Deklarace typedef je deklarace s typedef jako třída úložiště.Deklarátor se změní na nový typ.Deklarace typedef je možné použít pro vytvoření kratších nebo výstižnějších názvů pro typy, které jsou již definovány jazykem C, nebo pro vlastní deklarované typy.Jména typedef umožňují zapouzdřit podrobnosti implementace, které se mohou změnit.
Deklarace typedef je interpretována stejným způsobem jako proměnná nebo deklarace funkce, ale identifikátor se namísto typu určeného deklarací, stane synonymem typu.
Syntax
declaration:
Specifikátory deklarace seznam deklarace init opt**;**specifikátory deklarace:
specifikátor typu úložiště specifikátory deklarace optspecifikátor typu specifikátory deklarace opt
kvalifikátor typu specifikátory deklarace opt
specifikátor třídy úložiště
typedefspecifikátor typu:
voidchar
short
int
long
float
double
signed
unsigned
specifikátor struktury nebo sjednocení
specifikátor výčtu
název typedef
název typedef
identifikátor
Všimněte si, že deklarace typefef nevytváří typy.Vytváří synonymy existujících typů nebo názvy typů, které lze zadat jiným způsobem.Při použití názvu typedef jako specifikátor typu, jej lze kombinovat s určitými specifikátory typu, nikoli však s ostatními.Přijatelné modifikátory zahrnují const a volatile.
Názvy typeDef sdílejí obor názvů s běžnými identifikátory (více informací v tématu Obory názvů).Program tedy může mít typedef název a identifikátor místního rozsahu se stejným názvem.Příklad:
typedef char FlagType;
int main()
{
}
int myproc( int )
{
int FlagType;
}
Při deklarování identifikátoru místního rozsahu se stejným názvem jako typedef nebo při deklarování členu struktury nebo union ve stejném rozsahu nebo ve vnitřním rozsahu, musí být určen specifikátor typu.Toto omezení je zobrazeno na následujícím příkladu:
typedef char FlagType;
const FlagType x;
Pro znovupoužíti jména FlagType pro identifikátor, člen struktury nebo člen union, musí být určen typ:
const int FlagType; /* Type specifier required */
Nestačí říct
const FlagType; /* Incomplete specification */
protože FlagType se rozumí část typu, nikoli identifikátor, který je znovu deklarován.Tato deklarace je neplatná deklarace jako například
int; /* Illegal declaration */
Pomocí typedef je možné deklarovat jakýkoli typ, včetně ukazatele, funkce a typů polí.Je možné deklarovat název typedef pro ukazatel na strukturu nebo typ union před definováním struktury nebo typu union, dokud má definice stejnou viditelnost jako deklarace.
Názvy typeDef lze použít ke zlepšení čitelnosti kódu.Všechny tři následující deklarace signal určují přesně stejný typ, první bez použití jakýchkoli názvů 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 */
Příklady
Následující příklady zobrazují deklarace typedef:
typedef int WHOLE; /* Declares WHOLE to be a synonym for int */
Všimněte si, že WHOLE nyní nelze použít v deklaraci proměnné, jako je WHOLE i; nebo const WHOLE i;.Deklarace long WHOLE i; by však byla neplatná.
typedef struct club
{
char name[30];
int size, year;
} GROUP;
Tento příkaz deklaruje GROUP jako typ struktury se třemi členy.Vzhledem k tomu, že je definována také značka club, lze v deklaracích použít název typedef (GROUP) nebo značku struktury.Spolu se značkou je nutné použít klíčové slovo struct a nelze jej použít spolu s názvem typedef.
typedef GROUP *PG; /* Uses the previous typedef name
to declare a pointer */
Typ PG je deklarován jako ukazatel na typ GROUP, který je zase definován jako typ struktury.
typedef void DRAWF( int, int );
Následující příklad poskytuje typ DRAWF funkce nevracející žádnou hodnotu a přijímající dva celočíselné argumenty.To například znamená, že deklarace
DRAWF box;
je shodná s deklarací
void box( int, int );