Dela via


Typedef-deklarationer

En typedef-deklaration är en deklaration med typedef som lagringsklass. Deklaratorn blir en ny typ. Du kan använda typedef-deklarationer för att skapa kortare eller mer meningsfulla namn för typer som redan definierats av C eller för typer som du har deklarerat. Med Typedef-namn kan du kapsla in implementeringsinformation som kan ändras.

En typedef-deklaration tolkas på samma sätt som en variabel eller funktionsdeklaration, men identifieraren blir i stället för att anta den typ som anges i deklarationen synonym för typen.

Syntax

declaration:
declaration-specifiers init-declarator-list välja;

declaration-specifiers:
storage-class-specifier declaration-specifiers välja
type-specifier declaration-specifiers välja
type-qualifier declaration-specifiers välja

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

En typedef-deklaration skapar inte nya typer. Den skapar synonymer för befintliga typer eller namn för typer som kan anges på andra sätt. När ett typedef-namn används som typspecificerare kan det kombineras med vissa typspecificerare, men inte andra. Acceptabla modifierare inkluderar const och volatile.

Typedef-namn delar namnutrymmet med vanliga identifierare. Mer information finns i Namnutrymmen. Därför kan ett program ha ett typedef-namn och en lokal omfångsidentifierare med samma namn. Till exempel:

typedef char FlagType;

int main()
{
}

int myproc( int )
{
    int FlagType;
}

När du deklarerar en lokal omfångsidentifierare med samma namn som en typedef, eller när du deklarerar en medlem i en struktur eller union i samma omfång eller i ett inre omfång, måste du också ange typspecificeraren. Det här exemplet illustrerar den här begränsningen:

typedef char FlagType;
const FlagType x;

Om du vill återanvända FlagType namnet på en identifierare, en strukturmedlem eller en fackföreningsmedlem måste typen anges:

const int FlagType;  /* Type specifier required */

Det räcker inte att säga

const FlagType;      /* Incomplete specification */

FlagType eftersom anses vara en del av typen, inte en identifierare som redeclared. Denna förklaring anses vara en olaglig förklaring som

int;  /* Illegal declaration */

Du kan deklarera vilken typ som helst med typedef, inklusive pekare, funktion och matristyper. Du kan deklarera ett typedef-namn för en pekare till en struktur- eller unionstyp innan du definierar strukturen eller unionstypen, så länge definitionen har samma synlighet som deklarationen.

Typedef-namn kan användas för att förbättra kodens läsbarhet. Alla tre av följande deklarationer signal anger exakt samma typ, den första utan att använda några typedef-namn.

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 */

Exempel

Följande exempel illustrerar typedef-deklarationer:

typedef int WHOLE; /* Declares WHOLE to be a synonym for int */

Kan till exempel WHOLE nu användas i en variabeldeklaration som WHOLE i; eller const WHOLE i;. Deklarationen long WHOLE i; skulle dock vara olaglig.

typedef struct club
{
    char name[30];
    int size, year;
} GROUP;

Den här instruktionen deklarerar GROUP som en strukturtyp med tre medlemmar. Eftersom en strukturtagg, club, också anges, kan antingen typedef-namnet (GROUP) eller strukturtaggen användas i deklarationer. Du måste använda nyckelordet struct med taggen och du kan inte använda nyckelordet struct med typedef-namnet.

typedef GROUP *PG; /* Uses the previous typedef name
                      to declare a pointer            */

Typen PG deklareras som en pekare till GROUP typen, som i sin tur definieras som en strukturtyp.

typedef void DRAWF( int, int );

Det här exemplet innehåller typen DRAWF för en funktion som inte returnerar något värde och tar två int-argument. Det innebär till exempel att deklarationen

DRAWF box;

motsvarar deklarationen

void box( int, int );

Se även

Deklarationer och typer