Identificatore typedef
Una dichiarazione typedef introduce un nome che, all'interno del relativo ambito, diventa sinonimo del tipo fornito dalla parte della type-declaration della dichiarazione.
typedef type-declaration synonym;
Note
È possibile utilizzare le dichiarazioni typedef per costruire nomi più brevi o più significativi per i tipi già definiti dal linguaggio o per i tipi che si sono dichiarati. I nomi di typedef consentono di incapsuliate i dettagli di implementazione che possono essere modificati.
A differenza delle dichiarazioni class, struct, union e enum, le dichiarazioni typedef non introducono nuovi tipi — introducono nuovi nomi per i tipi esistenti.
I nomi di typedef condividono il namespace con gli identificatori comuni. Pertanto, un programma può avere un nome typedef e un identificatore locale dello stesso nome.
Per ulteriori informazioni, vedere:
Esempio
// typedef_specifier1.cpp
typedef char FlagType;
int main()
{
}
void myproc( int )
{
int FlagType;
}
Quando si dichiara un identificatore locale dello stesso nome di un typedef, o quando si dichiara un membro di una struttura o unione nello stesso ambito o in un ambito interno, l'identificatore di tipo deve essere specificato. Ad esempio:
typedef char FlagType;
const FlagType x;
Per riutilizzare il nome FlagType per un identificatore, una structure o una union, il tipo deve essere fornito:
const int FlagType; // Type specifier required
Non è sufficiente per dire
const FlagType; // Incomplete specification
poiché FlagType viene utilizzato per essere parte del tipo, non un identificatore che diventa ridichiarato. Questa dichiarazione viene presa come dichiarazione non valida
int; // Illegal declaration
È possibile dichiarare qualsiasi tipo con typedef, incluso i tipi puntatore, funzione e matrice. È possibile dichiarare un nome typedef per un puntatore a un tipo di union o di struttura prima di definire il tipo di struttura o di union, finché la definizione ha la stessa visibilità della dichiarazione.
Esempi
Un utilizzo delle dichiarazioni typedef è fare dichiarazioni più uniformi e compatte. Ad esempio:
typedef char CHAR; // Character type.
typedef CHAR * PSTR; // Pointer to a string (char *).
PSTR strchr( PSTR source, CHAR target );
typedef unsigned long ulong;
ulong ul; // Equivalent to "unsigned long ul;"
Per utilizzare typedef per specificare tipi di base e derivati nella stessa dichiarazione, è possibile separare i dichiaratori con le virgole. Ad esempio:
typedef char CHAR, *PSTR;
L'esempio riportato di seguito mostra il tipo DRAWF per una funzione che non restituisce valori e che accetta due argomenti di tipo int:
typedef void DRAWF( int, int );
Dopo l'istruzione typedef, la dichiarazione
DRAWF box;
è equivalente alla dichiarazione
void box( int, int );
typedef viene spesso combinato con struct per dichiarare e dare un nome ai tipi definiti dall'utente:
// typedef_specifier2.cpp
#include <stdio.h>
typedef struct mystructtag
{
int i;
double f;
} mystruct;
int main()
{
mystruct ms;
ms.i = 10;
ms.f = 0.99;
printf_s("%d %f\n", ms.i, ms.f);
}