Sdílet prostřednictvím


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-specifiersinit-declarator-listvolit ;

declaration-specifiers:
storage-class-specifierdeclaration-specifiersvolit
type-specifierdeclaration-specifiersvolit
type-qualifierdeclaration-specifiersvolit

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, typedefvč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 clubtaké 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 );

Viz také

Deklarace a typy