Namespaces
Variants

Typedef declaration

From cppreference.net

La déclaration typedef fournit un moyen de déclarer un identifiant comme alias de type, à utiliser pour remplacer un nom de type potentiellement complexe

Le mot-clé typedef est utilisé dans une déclaration , dans la position grammaticale d'un spécificateur de classe de stockage , sauf qu'il n'affecte ni le stockage ni la liaison :

typedef int int_t; // déclare int_t comme un alias pour le type int
typedef char char_t, *char_p, (*fp)(void); // déclare char_t comme un alias pour char
                                           // char_p comme un alias pour char*
                                           // fp comme un alias pour char(*)(void)

Table des matières

Explication

Si une déclaration utilise typedef comme spécificateur de classe de stockage, chaque déclarateur définit un identifiant comme un alias du type spécifié. Puisqu'un seul spécificateur de classe de stockage est autorisé dans une déclaration, une déclaration typedef ne peut pas être static ou extern .

La déclaration typedef n'introduit pas un type distinct, elle établit seulement un synonyme pour un type existant, ainsi les noms typedef sont compatibles avec les types qu'ils aliassent. Les noms typedef partagent l' espace de noms avec les identifiants ordinaires tels que les énumérateurs, les variables et les fonctions.

Un typedef pour un VLA ne peut apparaître qu'au niveau de la portée de bloc. La longueur du tableau est évaluée chaque fois que le flux de contrôle passe par la déclaration du typedef, contrairement à la déclaration du tableau lui-même :

void copyt(int n)
{
    typedef int B[n]; // B is a VLA, its size is n, evaluated now
    n += 1;
    B a; // size of a is n from before +=1
    int b[n]; // a and b are different sizes
    for (int i = 1; i < n; i++)
        a[i-1] = b[i];
}
(depuis C99)

Notes

Le nom typedef peut être un type incomplet , qui peut être complété comme d'habitude :

typedef int A[]; // A est int[]
A a = {1, 2}, b = {3,4,5}; // type de a est int[2], type de b est int[3]

Les déclarations typedef sont souvent utilisées pour injecter des noms de l'espace de noms des balises name space dans l'espace de noms ordinaire :

typedef struct tnode tnode; // tnode dans l'espace de noms ordinaire
                            // est un alias pour tnode dans l'espace de noms des balises
struct tnode {
    int count;
    tnode *left, *right; // identique à struct tnode *left, *right;
}; // maintenant tnode est également un type complet
tnode s, *sp; // identique à struct tnode s, *sp;

Ils peuvent même éviter complètement d'utiliser l'espace de noms des balises :

typedef struct { double hi, lo; } range;
range z, *zp;

Les noms typedef sont également couramment utilisés pour simplifier la syntaxe des déclarations complexes :

// tableau de 5 pointeurs vers des fonctions retournant des pointeurs vers des tableaux de 3 entiers
int (*(*callbacks[5])(void))[3];
// même chose avec des typedefs
typedef int arr_t[3]; // arr_t est un tableau de 3 entiers
typedef arr_t* (*fp)(void); // pointeur vers une fonction retournant arr_t*
fp callbacks[5];

Les bibliothèques exposent souvent des types dépendants du système ou de la configuration sous forme d'alias typedef, afin de présenter une interface cohérente aux utilisateurs ou aux autres composants de la bibliothèque :

#if defined(_LP64)
typedef int     wchar_t;
#else
typedef long    wchar_t;
#endif

Références

  • Norme C23 (ISO/IEC 9899:2024) :
  • 6.7.8 Définitions de types (p: TBD)
  • Norme C17 (ISO/CEI 9899:2018) :
  • 6.7.8 Définitions de types (p: TBD)
  • Norme C11 (ISO/IEC 9899:2011) :
  • 6.7.8 Définitions de types (p: 137-138)
  • Norme C99 (ISO/IEC 9899:1999) :
  • 6.7.7 Définitions de types (p: 123-124)
  • Norme C89/C90 (ISO/IEC 9899:1990) :
  • 3.5.6 Définitions de types

Mots-clés

typedef

Voir aussi

Documentation C++ pour typedef declaration