Déclarations typedef
Une déclaration typedef est une déclaration avec typedef comme classe de stockage. Le déclarateur devient un nouveau type. Vous pouvez utiliser des déclarations typedef pour construire des noms plus courts ou plus explicites pour des types déjà définis par C ou pour des types que vous avez déclarés. Les noms typedef vous permettent d'encapsuler des détails d'implémentation susceptibles de changer.
Une déclaration typedef est interprétée de la même façon qu'une déclaration de fonction ou variable, mais l'identificateur, au lieu d'assumer le type spécifié par la déclaration, devient un synonyme du type.
Syntaxe
declaration
:
declaration-specifiers
init-declarator-list
opt ;
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
Une déclaration typedef ne crée pas de nouveaux types. Elle crée des synonymes pour des types existants ou des noms pour des types qui peuvent être spécifiés d'autres manières. Lorsqu'un nom typedef est utilisé comme spécificateur de type, il peut être combiné avec certains spécificateurs de type, mais pas d'autres. Les modificateurs acceptables sont const
et volatile
.
Les noms typedef partagent l’espace de noms avec les identificateurs ordinaires. (Pour plus d’informations, consultez Espaces de noms.) Par conséquent, un programme peut avoir un nom typedef et un identificateur de portée locale du même nom. Par exemple :
typedef char FlagType;
int main()
{
}
int myproc( int )
{
int FlagType;
}
Lorsque vous déclarez un identificateur d’étendue locale du même nom qu’un typedef, ou déclarez un membre d’une structure ou d’une union dans la même étendue ou dans une étendue interne, vous devez également indiquer le spécificateur de type. Cet exemple illustre cette contrainte :
typedef char FlagType;
const FlagType x;
Pour réutiliser le nom FlagType
pour un identificateur, un membre de structure ou un membre d'union, le type doit être fourni :
const int FlagType; /* Type specifier required */
Il ne suffit pas de déclarer
const FlagType; /* Incomplete specification */
car FlagType
est considéré comme faisant partie du type, et non comme un identificateur qui est redéclaré. Cette déclaration est considérée comme étant une déclaration non conforme comme
int; /* Illegal declaration */
Vous pouvez déclarer tout type avec typedef
, y compris des types de pointeur, de fonction et de tableau. Vous pouvez déclarer un nom typedef pour un pointeur vers une structure ou un type union avant de définir la structure ou le type union, tant que la définition a la même visibilité que la déclaration.
Les noms typedef peuvent servir à améliorer la lisibilité du code. Les trois déclarations suivantes de signal
spécifient exactement le même type, la première sans utiliser aucun nom typedef.
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 */
Exemples
Les exemples suivants illustrent des déclarations typedef :
typedef int WHOLE; /* Declares WHOLE to be a synonym for int */
Par exemple, WHOLE
pourrait maintenant être utilisé dans une déclaration de variable comme WHOLE i;
ou const WHOLE i;
. Toutefois, la déclaration long WHOLE i;
serait non conforme.
typedef struct club
{
char name[30];
int size, year;
} GROUP;
Cette instruction déclare GROUP
comme type de structure avec trois membres. Étant donné qu'une balise de structure, club
, est également spécifiée, vous pouvez utiliser le nom typedef (GROUP
) ou la balise de structure dans les déclarations. Vous devez utiliser le mot clé struct
avec la balise, et ne pouvez pas utiliser le mot clé struct
avec le nom typedef.
typedef GROUP *PG; /* Uses the previous typedef name
to declare a pointer */
Le type PG
est déclaré comme pointeur vers le type GROUP
, qui à son tour est défini comme un type structure.
typedef void DRAWF( int, int );
Cet exemple fournit le type DRAWF
pour une fonction qui ne retourne aucune valeur et qui accepte deux arguments int. Cela signifie, par exemple, que la déclaration
DRAWF box;
équivaut à la déclaration
void box( int, int );