Что означает этот оператор 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