Typedef-Deklarationen
Eine typedef-Deklaration ist eine Deklaration mit typedef als Speicherklasse. Der Deklarator wird ein neuer Typ. Sie können typedef-Deklarationen verwenden, um kürzere oder aussagekräftigere Namen für Typen zu erstellen, die bereits von der C-Programmiersprache definiert sind, oder für Typen, die Sie deklariert haben. Mithilfe von typedef-Namen können Sie die Implementierungsdetails kapseln, die sich möglicherweise ändern.
Eine typedef-Deklaration wird auf die gleiche Weise wie eine Variable oder eine Funktionsdeklaration interpretiert. Der Bezeichner wird allerdings ein Synonym für den Typ, statt den von der Deklaration angegebenen Typ anzunehmen.
Syntax
declaration
:
declaration-specifiers
optinit-declarator-list
;
declaration-specifiers
:
storage-class-specifier
declaration-specifiers
opt
type-specifier
declaration-specifiers
opt
type-qualifier
declaration-specifiers
opt
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
Eine typedef-Deklaration erstellt keine neuen Typen. Es werden Synonyme für vorhandene Typen oder Namen für Typen erstellt, die auf andere Weise angegeben werden können. Wenn ein typedef-Name als Typspezifizierer verwendet wird, kann er nur mit bestimmten Typspezifizierern kombiniert werden. Zulässige Modifizierer sind const
und volatile
.
Typedef-Namen verwenden denselben Namespace wie gewöhnliche Bezeichner. (Weitere Informationen finden Sie unter Namespaces.) Aus diesem Grund kann ein Programm einen typedef-Namen und einen Bezeichner für den lokalen Gültigkeitsbereich mit demselben Namen aufweisen. Beispiel:
typedef char FlagType;
int main()
{
}
int myproc( int )
{
int FlagType;
}
Wenn Sie einen Bezeichner für den lokalen Gültigkeitsbereich mit demselben Namen wie eine typedef deklarieren oder wenn Sie einen Member einer Struktur oder Union in demselben Gültigkeitsbereich oder in einem inneren Bereich deklarieren, müssen Sie auch den Typspezifizierer angeben. Das folgende Beispiel veranschaulicht diese Einschränkung:
typedef char FlagType;
const FlagType x;
Um den FlagType
-Namen für einen Bezeichner, einen Strukturmember oder einen Unionsmember wiederzuverwenden, muss der Typ angegeben werden:
const int FlagType; /* Type specifier required */
Folgendes ist nicht ausreichend:
const FlagType; /* Incomplete specification */
Das liegt daran, dass FlagType
als ein Teil des Typs angesehen wird, und nicht als Bezeichner, der neu deklariert wird. Diese Deklaration wird als ungültige Deklaration angesehen, wie etwa
int; /* Illegal declaration */
Sie können einen beliebigen Typ mit typedef
deklarieren, einschließlich Zeiger-, Funktions- und Arraytypen. Sie können einen typedef-Namen für einen Zeiger auf einen Struktur- oder einen Union-Typ deklarieren, bevor Sie den Struktur- oder Union-Typ definieren, solange die Definition die gleiche Sichtbarkeit wie die Deklaration aufweist.
Typedef-Namen können verwendet werden, um die Codelesbarkeit zu verbessern. Alle drei der folgenden Deklarationen von signal
geben genau den gleichen Typ an, wobei der erste keine typedef-Namen verwendet.
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 */
Beispiele
Die folgenden Beispiele veranschaulichen typedef-Deklarationen:
typedef int WHOLE; /* Declares WHOLE to be a synonym for int */
Beispielsweise kann WHOLE
jetzt in einer Variablendeklaration wie WHOLE i;
oder const WHOLE i;
verwendet werden. Die Deklaration long WHOLE i;
ist hingegen ungültig.
typedef struct club
{
char name[30];
int size, year;
} GROUP;
Diese Anweisung deklariert GROUP
als Strukturtyp mit drei Membern. Da auch ein Strukturtag, club
, angegeben wird, kann entweder der typedef-Name (GROUP
) oder das Strukturtag in Deklarationen verwendet werden. Sie müssen das struct
-Schlüsselwort mit dem Tag verwenden. Das struct
-Schlüsselwort kann nicht mit dem typedef-Namen verwendet werden.
typedef GROUP *PG; /* Uses the previous typedef name
to declare a pointer */
Der Typ PG
wird als Zeiger auf den GROUP
-Typ deklariert, der wiederum als Strukturtyp definiert ist.
typedef void DRAWF( int, int );
In diesem Beispiel wird der Typ DRAWF
für eine Funktion bereitgestellt, die keinen Wert zurückgibt und zwei int-Argumente akzeptiert. Dies bedeutet beispielsweise, dass die Deklaration
DRAWF box;
äquivalent ist zur Deklaration
void box( int, int );