Zoeken…


Invoering

De typedef en (sinds C ++ 11) using trefwoorden kunnen worden gebruikt om een bestaande naam een nieuwe naam te geven.

Syntaxis

  • typedef type-specifier-seq init-declarator-lijst ;
  • attribuut-specificatie-seq typedef DEC -specificatie-seq init-declarator-lijst ; // sinds C ++ 11
  • met behulp van identifier attribute-specifier-seq ( opt ) = type-id ; // sinds C ++ 11

Basic typedef syntaxis

Een typedef declaratie heeft dezelfde syntaxis als een variabele of functiedeclaratie, maar bevat het woord typedef . De aanwezigheid van typedef zorgt ervoor dat de verklaring een type typedef plaats van een variabele of functie.

int T;         // T has type int
typedef int T; // T is an alias for int

int A[100];         // A has type "array of 100 ints"
typedef int A[100]; // A is an alias for the type "array of 100 ints"

Nadat een type-alias is gedefinieerd, kan deze uitwisselbaar worden gebruikt met de oorspronkelijke naam van het type.

typedef int A[100];
// S is a struct containing an array of 100 ints
struct S {
    A data;
};

typedef nooit een bepaald type. Het geeft alleen een andere manier om naar een bestaand type te verwijzen.

struct S {
    int f(int);
};
typedef int I;
// ok: defines int S::f(int)
I S::f(I x) { return x; }

Meer complex gebruik van typedef

De regel dat typedef aangiften dezelfde syntaxis hebben als gewone variabele- en functieverklaringen, kan worden gebruikt om complexere aangiften te lezen en te schrijven.

void (*f)(int);         // f has type "pointer to function of int returning void"
typedef void (*f)(int); // f is an alias for "pointer to function of int returning void"

Dit is vooral handig voor constructies met verwarrende syntaxis, zoals verwijzingen naar niet-statische leden.

void (Foo::*pmf)(int);         // pmf has type "pointer to member function of Foo taking int
                               // and returning void"
typedef void (Foo::*pmf)(int); // pmf is an alias for "pointer to member function of Foo
                               // taking int and returning void"

Het is moeilijk om de syntaxis van de volgende functieverklaringen te onthouden, zelfs voor ervaren programmeurs:

void (Foo::*Foo::f(const char*))(int);
int (&g())[100];

typedef kan worden gebruikt om ze gemakkelijker te lezen en te schrijven:

typedef void (Foo::pmf)(int);  // pmf is a pointer to member function type
pmf Foo::f(const char*);       // f is a member function of Foo

typedef int (&ra)[100];        // ra means "reference to array of 100 ints"
ra g();                        // g returns reference to array of 100 ints

Meerdere typen declareren met typedef

Het sleutelwoord typedef is een specificator, dus het is afzonderlijk van toepassing op elke declarator. Daarom verwijst elke gedeclareerde naam naar het type dat die naam zou hebben zonder typedef .

int *x, (*p)();         // x has type int*, and p has type int(*)()
typedef int *x, (*p)(); // x is an alias for int*, while p is an alias for int(*)()

Aliasverklaring met "gebruiken"

C ++ 11

De syntaxis van het using is heel eenvoudig: de te definiëren naam bevindt zich aan de linkerkant en de definitie aan de rechterkant. U hoeft niet te scannen om te zien waar de naam is.

using I = int;
using A = int[100];             // array of 100 ints
using FP = void(*)(int);        // pointer to function of int returning void
using MP = void (Foo::*)(int);  // pointer to member function of Foo of int returning void

Een type-alias maken met using heeft exact hetzelfde effect als het maken van een type-alias met typedef . Het is gewoon een alternatieve syntaxis om hetzelfde te bereiken.

In tegenstelling tot typedef kan using worden gemaakt van sjablonen. Een "template typedef" gemaakt met using heet een alias template .



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow