Поиск…


Вступление

Параметры typedef и (начиная с C ++ 11) using ключевых слов могут использоваться для обозначения нового имени существующего типа.

Синтаксис

  • typedef type-specifier-seq init-declarator-list ;
  • attribute-specifier-seq typedef decl-specifier-seq init-declarator-list ; // с C ++ 11
  • используя идентификатор attribute-specifier-seq ( opt ) = type-id ; // с C ++ 11

Основной синтаксис typedef

Объявление typedef имеет тот же синтаксис, что и объявление переменной или функции, но содержит слово typedef . Присутствие typedef заставляет объявление объявлять тип вместо переменной или функции.

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"

Как только псевдоним типа определен, его можно использовать взаимозаменяемо с исходным именем типа.

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

typedef никогда не создает отдельный тип. Это дает только другой способ ссылаться на существующий тип.

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

Более сложное использование typedef

Правило о том, что объявления typedef имеют тот же синтаксис, что и обычные объявления переменных и функций, могут использоваться для чтения и записи более сложных объявлений.

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"

Это особенно полезно для конструкций с запутанным синтаксисом, таких как указатели на нестатические элементы.

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"

Трудно вспомнить синтаксис следующих объявлений функций, даже для опытных программистов:

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

typedef может использоваться для упрощения чтения и записи:

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

Объявление нескольких типов с помощью typedef

Ключевое слово typedef является спецификатором, поэтому оно применяется отдельно для каждого декларатора. Следовательно, каждое объявленное имя относится к типу, которое это имя имело бы при отсутствии 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(*)()

Объявление псевдонима с "использованием"

C ++ 11

Синтаксис using очень прост: имя, которое должно быть определено, идет с левой стороны, а определение - с правой стороны. Не нужно сканировать, чтобы узнать, где это имя.

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

Создание псевдонима типа с using имеет тот же эффект, что и создание псевдонима типа с typedef . Это просто альтернативный синтаксис для достижения того же.

В отличие от typedef , using может быть шаблоном. «Шаблон typedef», созданный с using , называется шаблоном псевдонимов .



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow