Namespaces
Variants

typedef specifier

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous
  • 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

typedef

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