Dichiarazioni typedefTypedef Declarations

La dichiarazione typedef è una dichiarazione con typedef come classe di archiviazione.A typedef declaration is a declaration with typedef as the storage class. Il dichiaratore diventa un nuovo tipo.The declarator becomes a new type. È possibile utilizzare le dichiarazioni typedef per costruire nomi più brevi o più significativi per i tipi già definiti da C o per i tipi dichiarati.You can use typedef declarations to construct shorter or more meaningful names for types already defined by C or for types that you have declared. I nomi di typedef consentono di incapsulare dettagli di implementazione che possono cambiare.Typedef names allow you to encapsulate implementation details that may change.

Una dichiarazione typedef viene interpretata come una variabile o una dichiarazione di funzione, ma l'identificatore, anziché supporre il tipo specificato dalla dichiarazione, diventa un sinonimo del tipo.A typedef declaration is interpreted in the same way as a variable or function declaration, but the identifier, instead of assuming the type specified by the declaration, becomes a synonym for the type.

SintassiSyntax

declaration:declaration:
declaration-specifiers init-declarator-list opt;declaration-specifiers init-declarator-list opt;

declaration-specifiers:declaration-specifiers:
storage-class-specifier declaration-specifiers optstorage-class-specifier declaration-specifiers opt

type-specifier declaration-specifiers opttype-specifier declaration-specifiers opt

type-qualifier declaration-specifiers opttype-qualifier declaration-specifiers opt

storage-class-specifier:storage-class-specifier:
typedef

type-specifier:type-specifier:
voidvoid

charchar

shortshort

intint

longlong

floatfloat

doubledouble

signedsigned

unsignedunsigned

struct-or-union-specifierstruct-or-union-specifier

enum-specifierenum-specifier

typedef-nametypedef-name

typedef-name:typedef-name:
identifieridentifier

Si noti che una dichiarazione typedef non crea tipi.Note that a typedef declaration does not create types. Crea sinonimi per i tipi esistenti o nomi per tipi che possono essere specificati in altri modi.It creates synonyms for existing types, or names for types that could be specified in other ways. Quando un nome di typedef viene utilizzato come identificatore di tipo, può essere combinato con certi identificatori di tipo, ma non altri.When a typedef name is used as a type specifier, it can be combined with certain type specifiers, but not others. I modificatori accettabili sono const e volatile.Acceptable modifiers include const and volatile.

I nomi di typedef condividono lo spazio dei nomi con identificatori comuni. Per altre informazioni, vedere Spazi dei nomi.Typedef names share the name space with ordinary identifiers (see Name Spaces for more information). Pertanto, un programma può avere un nome di typedef e un identificatore in ambito locale dello stesso nome.Therefore, a program can have a typedef name and a local-scope identifier by the same name. Ad esempio:For example:

typedef char FlagType;  

int main()  
{  
}  

int myproc( int )  
{  
    int FlagType;  
}  

Quando si dichiara un identificatore in ambito locale dello stesso nome di un typedef o quando si dichiara un membro di una struttura o un'unione nello stesso ambito o in un ambito interno, l'identificatore di tipo deve essere specificato.When declaring a local-scope identifier by the same name as a typedef, or when declaring a member of a structure or union in the same scope or in an inner scope, the type specifier must be specified. Nell'esempio viene illustrato questo vincolo:This example illustrates this constraint:

typedef char FlagType;  
const FlagType x;  

Per riutilizzare il nome FlagType per un identificatore, un membro della struttura o un membro dell'unione, deve essere fornito il tipo:To reuse the FlagType name for an identifier, a structure member, or a union member, the type must be provided:

const int FlagType;  /* Type specifier required */  

Non è sufficiente direIt is not sufficient to say

const FlagType;      /* Incomplete specification */  

perché FlagType viene usato per far parte del tipo e non un identificatore che viene ridichiarato.because the FlagType is taken to be part of the type, not an identifier that is being redeclared. Questa dichiarazione si suppone essere una dichiarazione non consentita qualeThis declaration is taken to be an illegal declaration like

int;  /* Illegal declaration */  

È possibile dichiarare qualsiasi tipo con typedef, incluso il puntatore, la funzione e i tipi di matrice.You can declare any type with typedef, including pointer, function, and array types. È possibile dichiarare un nome di typedef per un puntatore a un tipo di unione o di struttura prima di definire il tipo di struttura o di unione, purché la definizione abbia la stessa visibilità della dichiarazione.You can declare a typedef name for a pointer to a structure or union type before you define the structure or union type, as long as the definition has the same visibility as the declaration.

I nomi di typedef possono essere utilizzati per migliorare la leggibilità del codice.Typedef names can be used to improve code readability. Tutte e tre le seguenti dichiarazioni di signal indicano esattamente lo stesso tipo, la prima senza utilizzare alcun nome di typedef.All three of the following declarations of signal specify exactly the same type, the first without making use of any typedef names.

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

EsempiExamples

Negli esempi seguenti vengono illustrate le dichiarazioni typedef:The following examples illustrate typedef declarations:

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

Si noti che WHOLE adesso può essere utilizzato in una dichiarazione di variabile come WHOLE i; o const WHOLE i;.Note that WHOLE could now be used in a variable declaration such as WHOLE i; or const WHOLE i;. Tuttavia, la dichiarazione long WHOLE i; non è consentita.However, the declaration long WHOLE i; would be illegal.

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

Questa istruzione dichiara GROUP come un tipo di struttura con tre membri.This statement declares GROUP as a structure type with three members. Poiché viene anche specificato un tag della struttura, club, nelle dichiarazioni può essere utilizzato il nome di typedef (GROUP) o il tag della struttura.Since a structure tag, club, is also specified, either the typedef name (GROUP) or the structure tag can be used in declarations. È necessario utilizzare la parola chiave "struct" con il tag e non è possibile utilizzare la parola chiave "struct" con il nome di typedef.You must use the struct keyword with the tag, and you cannot use the struct keyword with the typedef name.

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

Il tipo PG è dichiarato come puntatore al tipo GROUP, che a sua volta è definito come tipo di struttura.The type PG is declared as a pointer to the GROUP type, which in turn is defined as a structure type.

typedef void DRAWF( int, int );  

Questo esempio fornisce il tipo DRAWF per una funzione che non restituisce valori e che accetta due argomenti di tipo int.This example provides the type DRAWF for a function returning no value and taking two int arguments. Ciò significa, ad esempio, che la dichiarazioneThis means, for example, that the declaration

DRAWF box;   

è equivalente alla dichiarazioneis equivalent to the declaration

void box( int, int );  

Vedere ancheSee Also