Partager via


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-listopt ;

declaration-specifiers:
storage-class-specifier declaration-specifiersopt
type-specifier declaration-specifiersopt
type-qualifier declaration-specifiersopt

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 );

Voir aussi

Déclarations et types