web-dev-qa-db-fra.com

Quelle est l'utilité de typedef?

À quoi sert le mot-clé typedef en C? Quand est-il nécessaire?

52
hks

typedef sert à définir quelque chose comme un type. Par exemple:

typedef struct {
  int a;
  int b;
} THINGY;

... définit THINGY comme la structure donnée. De cette façon, vous pouvez l'utiliser comme ceci:

THINGY t;

...plutôt que:

struct _THINGY_STRUCT {
  int a;
  int b;
};

struct _THINGY_STRUCT t;

... qui est un peu plus verbeux. typedefs peut rendre certaines choses considérablement plus claires, spécialement les pointeurs vers les fonctions.

49
T.J. Crowder

De wikipedia:

typedef est un mot-clé dans les langages de programmation C et C++. Le but de typedef est d'attribuer des noms alternatifs aux types existants, le plus souvent ceux dont la déclaration standard est lourde, potentiellement déroutante ou susceptible de varier d'une implémentation à l'autre.

Et:

K&R indique qu'il y a deux raisons d'utiliser un typedef. Premièrement, il fournit un moyen de rendre un programme plus portable. Au lieu d'avoir à changer un type partout où il apparaît dans les fichiers source du programme, une seule instruction typedef doit être modifiée. Deuxièmement, un typedef peut rendre une déclaration complexe plus facile à comprendre.

Et un argument contre:

Il (Greg K.H.) fait valoir que cette pratique non seulement obscurcit inutilement le code, mais peut également amener les programmeurs à utiliser accidentellement de grandes structures en les considérant comme des types simples.

30
Oded

Typedef est utilisé pour créer des alias pour les types existants . C'est un peu un impropre : typedef ne définit pas de nouveaux types car les nouveaux types sont interchangeables avec le type sous-jacent. Les typedefs sont souvent utilisés pour la clarté et la portabilité des définitions d'interface lorsque le type sous-jacent est sujet à changement ou n'est pas important.

Par exemple:

// Possibly useful in POSIX:
typedef int filedescriptor_t;

// Define a struct foo and then give it a typedef...
struct foo { int i; };
typedef struct foo foo_t;

// ...or just define everything in one go.
typedef struct bar { int i; } bar_t;

// Typedef is very, very useful with function pointers:
typedef int (*CompareFunction)(char const *, char const *);
CompareFunction c = strcmp;

Typedef peut également être utilisé pour donner des noms à des types sans nom. Dans de tels cas, le typedef sera le seul nom dudit type:

typedef struct { int i; } data_t;
typedef enum { YES, NO, FILE_NOT_FOUND } return_code_t;

Les conventions de dénomination diffèrent. Il est généralement recommandé d'utiliser un trailing_underscore_and_t ou CamelCase.

13
andyn

de Wikipedia: "KR déclare qu'il y a deux raisons d'utiliser un typedef. Premièrement .... Deuxièmement, un typedef peut rendre une déclaration complexe plus facile à comprendre."

Voici un exemple de la deuxième raison d'utiliser typedef, simplifiant les types complexes (le type complexe est tiré de KR "Le langage de programmation C deuxième édition p. 136).

char (*(*x([])())

x est une fonction renvoyant le pointeur vers le tableau [] du pointeur vers la fonction renvoyant char.

Nous pouvons rendre la déclaration ci-dessus compréhensible en utilisant des typedefs. Veuillez voir l'exemple ci-dessous.

typedef char (*pfType)(); // pf is the type of pointer to function returning
                          // char
typedef pfType pArrType[2];  // pArr is the type of array of pointers to
                             // functions returning char

char charf()
{ return('b');
}

pArrType pArr={charf,charf};
pfType *FinalF()     // f is a function returning pointer to array of
                     // pointer to function returning char
{
return(pArr);
}
4
shaul boyer

Explication de l'utilisation de typedef dans l'exemple suivant. De plus, Typedef est utilisé pour rendre le code plus lisible.

#include <stdio.h>
#include <math.h>

/*
To define a new type name with typedef, follow these steps:
1. Write the statement as if a variable of the desired type were being declared.
2. Where the name of the declared variable would normally appear, substitute the new type name.
3. In front of everything, place the keyword typedef.
*/

// typedef a primitive data type
typedef double distance;

// typedef struct 
typedef struct{
    int x;
    int y;
} point;

//typedef an array 
typedef point points[100]; 

points ps = {0}; // ps is an array of 100 point 

// typedef a function
typedef distance (*distanceFun_p)(point,point) ; // TYPE_DEF distanceFun_p TO BE int (*distanceFun_p)(point,point)

// prototype a function     
distance findDistance(point, point);

int main(int argc, char const *argv[])
{
    // delcare a function pointer 
    distanceFun_p func_p;

    // initialize the function pointer with a function address
    func_p = findDistance;

    // initialize two point variables 
    point p1 = {0,0} , p2 = {1,1};

    // call the function through the pointer
    distance d = func_p(p1,p2);

    printf("the distance is %f\n", d );

    return 0;
}

distance findDistance(point p1, point p2)
{
distance xdiff =  p1.x - p2.x;
distance ydiff =  p1.y - p2.y;

return sqrt( (xdiff * xdiff) + (ydiff * ydiff) );
} In front of everything, place the keyword typedef.
    */
4
Amjad

typedef n'introduit pas de nouveau type mais fournit simplement un nouveau nom pour un type.

TYPEDEF PEUT ÊTRE UTILISÉ POUR:

  1. Types qui combinent des tableaux, des structures, des pointeurs ou des fonctions.

  2. Pour faciliter la portabilité, typedef le type dont vous avez besoin. Ensuite, lorsque vous portez le code sur différentes plates-formes, sélectionnez le bon type en apportant des modifications uniquement dans le typedef.

  3. Un typedef peut fournir un nom simple pour un transtypage de type compliqué.

  4. typedef peut également être utilisé pour donner des noms à des types sans nom. Dans de tels cas, le typedef sera le seul nom pour ce type.

REMARQUE: - NE DOIT PAS UTILISER TYPEDEF AVEC DES STRUCTS. TOUJOURS UTILISER UN ÉTIQUETTE DANS UNE DÉFINITION DE STRUCTURE MÊME SI ELLE N'EST PAS NÉCESSAIRE.

4
Coffee_lover
typedef unsigned char BYTE;

Après cette définition de type, l'identifiant BYTE peut être utilisé comme abréviation pour le type char non signé, par exemple.

BYTE b1, b2;

2
mirhpe danielle

Il peut alias un autre type.

typedef unsigned int uint; /* uint is now an alias for "unsigned int" */
2
Thomas Bonini