typedef
specifier
-
-
typedef- crée un alias qui peut être utilisé n'importe où à la place d'un nom de type (éventuellement complexe).
-
Table des matières |
Explication
Le typedef spécificateur, lorsqu'il est utilisé dans une déclaration , spécifie que la déclaration est une déclaration typedef plutôt qu'une déclaration de variable ou de fonction.
Généralement, le typedef apparaît au début de la déclaration, bien qu'il soit permis d'apparaître après les spécificateurs de type , ou entre deux spécificateurs de type. Le typedef ne peut pas être combiné avec un autre spécificateur excepté les spécificateurs de type.
Une déclaration typedef peut déclarer un ou plusieurs identifiants sur la même ligne (par exemple int et un pointeur vers int ), elle peut déclarer des types tableau et fonction, des pointeurs et références, des types classe, etc. Chaque identifiant introduit dans cette déclaration devient un nom typedef , qui est un synonyme du type de l'objet ou de la fonction qu'il deviendrait si le mot-clé typedef était supprimé.
Les noms typedef sont des alias pour des types existants, et ne sont pas des déclarations de nouveaux types. typedef ne peut pas être utilisé pour modifier la signification d'un nom de type existant (y compris un nom typedef). Une fois déclaré, un nom typedef ne peut être redéclaré que pour faire référence au même type à nouveau. Les noms typedef ne sont effectifs que dans la portée où ils sont visibles : différentes fonctions ou déclarations de classe peuvent définir des types nommés identiquement avec des significations différentes.
Le typedef ne peut pas apparaître dans la déclaration d'un paramètre de fonction ni dans la decl-specifier-seq d'une définition de fonction :
void f1(typedef int param); // mal formé typedef int f2() {} // mal formé
Le typedef ne peut pas apparaître dans une déclaration qui ne contient pas de déclarateur :
typedef struct X {}; // mal formé
nom typedef à des fins de liaison
Si une déclaration typedef définit une classe ou une énumération sans nom, le premier nom typedef du type classe ou type énumération déclaré par la déclaration est le nom typedef à des fins de liaison de ce type.
Par exemple, dans
typedef
struct
{
/* ... */
}
S
;
,
S
est un nom typedef à des fins de liaison. Le type classe ou énumération défini de cette manière possède une
liaison externe
(sauf s'il se trouve dans un espace de noms anonyme).
|
Une classe sans nom définie de cette manière ne doit contenir que des constructions compatibles C. En particulier, elle ne doit pas :
et toutes les classes membres doivent également satisfaire à ces exigences (récursivement). |
(depuis C++20) |
Notes
|
Les alias de type offrent la même fonctionnalité que les déclarations typedef en utilisant une syntaxe différente, et sont également applicables aux noms de templates. |
(depuis C++11) |
Mots-clés
Exemple
// typedef simple typedef unsigned long ulong; // les deux objets suivants ont le même type unsigned long l1; ulong l2; // typedef plus complexe typedef int int_t, *intp_t, (&fp)(int, ulong), arr_t[10]; // les deux objets suivants ont le même type int a1[10]; arr_t a2; // attention : les deux objets suivants n'ont pas le même type const intp_t p1 = 0; // int *const p1 = 0 const int *p2; // idiome C courant pour éviter d'écrire "struct S" typedef struct { int a; int b; } S, *pS; // les deux objets suivants ont le même type pS ps1; S* ps2; // erreur : le spécificateur de classe de stockage ne peut pas apparaître dans une déclaration typedef // typedef static unsigned int uint; // typedef peut être utilisé n'importe où dans la séquence de spécificateurs de déclaration long unsigned typedef int long ullong; // plus conventionnellement écrit "typedef unsigned long long int ullong;" // std::add_const, comme de nombreuses autres métafonctions, utilise des typedef membres template<class T> struct add_const { typedef const T type; }; typedef struct Node { struct listNode* next; // déclare un nouveau type de structure (incomplet) nommé listNode } listNode; // erreur : conflit avec le nom de structure précédemment déclaré // C++20 erreur : "structure avec nom typedef pour la liaison" a des fonctions membres typedef struct { void f() {} } C_Incompatible;
Rapports de défauts
Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.
| DR | Appliqué à | Comportement publié | Comportement corrigé |
|---|---|---|---|
| CWG 576 | C++98 | typedef n'était pas autorisé dans l'ensemble de la définition de fonction | autorisé dans le corps de fonction |
| CWG 2071 | C++98 | typedef pouvait apparaître dans une déclaration ne contenant pas de déclarateur | désormais interdit |
Voir aussi
|
Documentation C
pour
Déclaration Typedef
|