Что означает этот оператор typedef?

На странице ссылок С++ они приводят некоторые примеры typedef, и я пытаюсь понять, что они означают.

// simple typedef
typedef unsigned long mylong;


// more complicated typedef
typedef int int_t, *intp_t, (&fp)(int, mylong), arr_t[10];

Итак, я понимаю, что просто typedef (первая декларация).

Но что они объявляют со вторым (повторяется ниже)?

typedef int int_t, *intp_t, (&fp)(int, ulong), arr_t[10];

В частности, что означает (&fp)(int, mylong)?

Ответ 1

Он объявляет сразу несколько typedefs, так же, как вы можете сразу объявить несколько переменных. Все они основаны на int, но некоторые из них модифицируются в составные типы.

Позвольте разбить его на отдельные объявления:

typedef int int_t;              // simple int
typedef int *intp_t;            // pointer to int
typedef int (&fp)(int, ulong);  // reference to function returning int
typedef int arr_t[10];          // array of 10 ints

Ответ 2

typedef int int_t, *intp_t, (&fp)(int, mylong), arr_t[10];

эквивалентно:

typedef int int_t;
typedef int *intp_t;
typedef int (&fp)(int, mylong);
typedef int arr_t[10];

В стандарте С++ 11 есть аналогичный пример:

С++ 11 7.1.3 Спецификатор typedef

A typedef -name не вводит новый тип, как это делает объявление class декларация (9.1) или enum. Пример: после

typedef int MILES , * KLICKSP ;

конструкции

MILES distance ;
extern KLICKSP metricp ;

- все правильные объявления; тип расстояния - int, а metricp - "указатель на int". -end пример

Ответ 3

Если у вас есть команда cdecl, вы можете использовать ее для демистификации этих объявлений.

cdecl> explain int (&fp)(int, char)
declare fp as reference to function (int, char) returning int
cdecl> explain int (*fp)(int, char)
declare fp as pointer to function (int, char) returning int

Если у вас нет cdecl, вы должны установить его обычным способом (например, в системах типа Debian, используя sudo apt-get install cdecl).

Ответ 4

Часть (&fp)(int, mylong) представляет ссылку на функцию. Не рекомендуется, чтобы программисты использовали функции в typedef по той причине, что вы задаете этот вопрос. Это путает других людей, смотрящих на код.

Я предполагаю, что они используют typedef примерно так:

typedef unsigned long mylong; //for completeness
typedef int (&fp)(int, mylong);
int example(int param1, mylong param2);

int main() {
     fp fp_function = example;
     int x = fp_function(0, 1);
     return 0;
}

int example(int param1, mylong param2) {
     // does stuff here and returns reference
     int x = param1;
     return x;
}

Отредактировано в соответствии с комментарием Брайана:

int(&name)(...) является ссылкой функции, называемой name (функция возвращает int)

int &name(...) - это функция, называемая name , возвращающая ссылку на int

Ссылка на функцию, возвращающую ссылку int, будет выглядеть примерно так: typedef int &(&fp)(int, mylong) (это компилируется в программе, но поведение не проверено).

Ответ 5

typedef определяет новый тип для использования в вашем коде, например сокращенное.

typedef typename _MyBase::value_type value_type;
value_type v;
//use v

typename здесь позволяет компилятору узнать, что value_type - это тип, а не объект внутри _MyBase.

the:: - область действия типа. Это вроде как "находится в" так value_type "находится в" _MyBase. или может также рассматриваться как содержащий.

Возможный дубликат: С++ - значение оператора, объединяющего typedef и typename