Typedef – deklarace
Deklarace typedef je deklarace s typedef jako třída úložiště. Deklarátor se stane novým typem. Deklarace typedef můžete použít k vytvoření kratších nebo smysluplnějších názvů pro typy, které jsou již definovány jazykem C nebo pro typy, které jste deklarovali. Názvy typedef umožňují zapouzdřit podrobnosti implementace, které se mohou změnit.
Deklarace typedef je interpretována stejným způsobem jako deklarace proměnné nebo funkce, ale identifikátor, nikoli za předpokladu, že typ určený deklarací, se stane synonymem pro daný typ.
Syntaxe
declaration
:
declaration-specifiers
init-declarator-list
volit ;
declaration-specifiers
:
storage-class-specifier
declaration-specifiers
volit
type-specifier
declaration-specifiers
volit
type-qualifier
declaration-specifiers
volit
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
Deklarace typedef nevytvoří nové typy. Vytvoří synonyma pro existující typy nebo názvy typů, které lze zadat jinými způsoby. Pokud je název typedef použit jako specifikátor typu, lze jej kombinovat s určitými specifikátory typu, ale ne s jinými. Přijatelné modifikátory zahrnují const
a volatile
.
Názvy typedef sdílejí prostor názvů s běžnými identifikátory. (Další informace najdete v tématu Name Spaces.) Program proto může mít název typedef a identifikátor místního oboru podle stejného názvu. Příklad:
typedef char FlagType;
int main()
{
}
int myproc( int )
{
int FlagType;
}
Když deklarujete identifikátor místního oboru stejným názvem jako typedef nebo když deklarujete člen struktury nebo sjednocení ve stejném oboru nebo ve vnitřním oboru, musíte také zadat specifikátor typu. Tento příklad znázorňuje toto omezení:
typedef char FlagType;
const FlagType x;
Pro opětovné použití názvu FlagType
pro identifikátor, člen struktury nebo člen sjednocení musí být určen typ:
const int FlagType; /* Type specifier required */
Není to dostatečné k tomu, abyste řekli
const FlagType; /* Incomplete specification */
protože FlagType
se považuje za část typu, nikoli identifikátor, který je znovu deklarován. Tato deklarace je neplatnou jako
int; /* Illegal declaration */
Můžete deklarovat libovolný typ, typedef
včetně ukazatele, funkce a typů polí. Je možné deklarovat název typedef pro ukazatel na typ struktury nebo sjednocení před definováním typu struktury nebo sjednocení, pokud má definice stejnou viditelnost jako deklarace.
Názvy typedef lze použít ke zlepšení čitelnosti kódu. Všechny tři z následujících deklarací signal
přesně stejného typu, první bez použití 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 znázorňují deklarace typedef:
typedef int WHOLE; /* Declares WHOLE to be a synonym for int */
Nyní je například možné použít v deklaraci proměnné, WHOLE
například 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 jako typ struktury se třemi GROUP
členy. Vzhledem k tomu, že značka struktury je club
také zadána, buď název typedef (GROUP
) nebo značka struktury lze použít v deklaracích. Musíte použít struct
klíčové slovo se značkou a klíčové slovo nemůžete použít struct
s názvem typedef.
typedef GROUP *PG; /* Uses the previous typedef name
to declare a pointer */
Typ PG
je deklarován jako ukazatel na GROUP
typ, který je následně definován jako typ struktury.
typedef void DRAWF( int, int );
Tento příklad poskytuje typ DRAWF
funkce vracející žádnou hodnotu a přebírá dva argumenty typu int. Znamená to například, že deklarace
DRAWF box;
je ekvivalentní deklaraci.
void box( int, int );