Что означает этот оператор typedef?
на справочной странице C++ они предоставляют некоторые примеры 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)
в смысле?
5 ответов:
он объявляет несколько 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
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];
есть на самом деле аналогичный пример в стандарте C++11:
C++11 7.1.3 The
typedef
спецификаторA
typedef
- name не вводит новый тип так, как Aclass
декларации (9.1) илиenum
декларации.Пример: послеtypedef int MILES , * KLICKSP ;
конструкции
MILES distance ; extern KLICKSP metricp ;
все правильные объявления; тип расстояния это int, что из
metricp
это "указатель наint
."- конец примера
если у вас , вы можете использовать ее чтобы развенчать эти заявления.
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
).
The
(&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)
(это компилируется в программе, но поведение не проверено).
typedef определяет новый тип для использования в коде, как стенография.
typedef typename _MyBase::value_type value_type; value_type v; //use v
typename здесь позволяет компилятору знать, что value_type является типом, а не объектом внутри _MyBase.
в :: объем тип. Это вроде как "находится в" так value_type "находится в" _MyBase. или также можно думать о том, как содержит.
возможные дубликаты : C++ - значение оператора, объединяющего typedef и typename