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

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 не вводит новый тип так, как A class декларации (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