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ürzeres oder aussagekräftige Namen für die Typen zu erstellen, die bereits von C definiert sind oder für Typen, die deklariert wurden.Typedef-Namen ermöglichen Ihnen die Implementierungsdetails zu kapseln, die möglicherweise ändern.
Eine Typedef-Deklaration wird auf die gleiche Weise wie eine Variable oder eine Funktionsdeklaration interpretiert, aber der Bezeichner, anstatt auf den Typ, der von der Deklaration angegeben wird, wird ein Synonym für den Typ.
Syntax
declaration:
Spezifizierer deklariert INIT-Deklarator Listeopt**;**Spezifizierer deklariert:
Speicherklassenspezifizierer Deklaration Bezeichner optTypspezifizierer Deklaration Bezeichner opt
Spezifizierer Deklaration Qualifizierer TYPE opt
Speicherklassenspezifizierer:
typedefTypspezifizierer:
voidchar
short
int
long
float
double
mit Vorzeichen
unsigned
Bezeichner Struktur-oder-UNION
Spezifizierer Enumeration
TypedefNAME
TypedefNAME:
identifier
Beachten Sie, dass eine Typedef-Deklaration Typen nicht erstellt.Er erstellt Synonyme für vorhandene Typen oder Namen für Typen, die auf andere Weise angegeben werden können.Wenn ein Typedef-Name als Typspezifizierer verwendet wird, kann sie mit bestimmten Typspezifizierern, jedoch keine anderen kombiniert werden.Annehmbares Modifizierer sind const und volatile.
Typedef-Namen geben den Namespace mit gewöhnlichen Bezeichnern (weitere Informationen finden Sie unter Namespaces ).Aus diesem Grund kann ein Programm einen Typedef-Namen und eine Variable vom SCOPE-Bezeichner haben die gleichen Namen.Beispiele:
typedef char FlagType;
int main()
{
}
int myproc( int )
{
int FlagType;
}
Beim Erstellen eines SCOPE-Bezeichner Variablen mit dem gleichen Namen wie eine Typdefinition oder wenn deklariert einen Member einer Struktur oder Union im gleichen Bereich oder in einem inneren Gültigkeitsbereich deklariert, muss der Typspezifizierer angegeben werden.Dieses Beispiel verdeutlicht diese Einschränkung:
typedef char FlagType;
const FlagType x;
Um den FlagType Namen für einen Bezeichner wiederzuverwenden, müssen ein Strukturmember oder Unionmember, der Typ bereitgestellt werden:
const int FlagType; /* Type specifier required */
So ist z. B. nicht genügend
const FlagType; /* Incomplete specification */
da FlagType genommen wird, um ein Teil des Typs ist kein Bezeichner, der neu deklariert wird.Durch diese Deklaration wird angenommen, dass eine ungültige Deklaration wie sein
int; /* Illegal declaration */
Sie können jeden Typ mit typedef, einschließlich Zeiger, Funktions- und Arraytypen deklarieren.Sie können einen Typedef-Namen für einen Zeiger auf eine Struktur oder ein Union-Typ deklarieren, bevor Sie die Struktur oder Union-Typ definieren, solange die Definition die gleiche Sichtbarkeit wie die Deklaration hat.
Typedef-Namen können verwendet werden, um Code Lesbarkeit zu verbessern.Alle drei der folgenden Deklarationen von signal geben genau den gleichen Typ, den ersten, ohne Typedef-Namen zu verwenden.
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 */
Beachten Sie, dass WHOLE in einer Variablendeklaration wie WHOLE i; oder const WHOLE i;nun verwendet werden kann.Allerdings würde die Deklaration long WHOLE i; ungültig sein.
typedef struct club
{
char name[30];
int size, year;
} GROUP;
Diese Anweisung deklariert GROUP als Strukturtyp mit drei Member.Da ein Struktur tag wird auch clubentweder der Typedef-Name (GROUP) angegeben, oder die Struktur tag kann in Deklarationen verwendet werden.Sie müssen das struct-Schlüsselwort mit dem Tag verwenden, und Sie können das struct-Schlüsselwort mit dem Typedef-Namen nicht verwenden.
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 );
Dieses Beispiel stellt den Typ DRAWF für eine Funktion bereit, die keinen Wert zurückgibt und zwei int-Argumente akzeptiert.Dies bedeutet beispielsweise, dass die Deklaration
DRAWF box;
ähnelt der Deklaration entsprechend
void box( int, int );