Подтвердить что ты не робот

Фундаментальный синтаксис операндов typedef

Дано:

typedef type-declaration synonym;

Я вижу, как:

typedef long unsigned int size_t;

объявляет size_t как синоним long unsigned int, однако я (знаю, что он делает это) не может точно определить, как:

typedef int (*F)(size_t, size_t);

объявляет F как синоним pointer to function (size_t, size_t) returning int

typedef два операнда (type-declaration, synonym) в первом примере: long unsigned int и size_t.

Каковы два аргумента typedef в объявлении F или могут быть перегруженные версии typedef?

Если существует соответствующее различие между C и С++, пожалуйста, уточните, что в первую очередь меня интересует С++, если это помогает.

4b9b3361

Ответ 1

Объявления типа с использованием typedef совпадают с объявлениями соответствующих переменных, только с typedef добавленным. Таким образом,

        int x; // declares a variable named 'x' of type 'int'
typedef int x; // declares a type named 'x' that is 'int'

Точно так же с типами указателей функций:

        int(*F)(size_t); // declares a variable named F of type 'int(*)(size_t)'
typedef int(*F)(size_t); // declares a type named 'F' that is 'int(*)(size_t)'

Это не "особый случай"; что именно выглядит тип указателя функции.

Ответ 2

Это не формальный синтаксис typedef, это просто один из шаблонов, который он может принять. В стандарте C 6.7.1 typedef синтаксически определяется как спецификатор класса хранения (например, extern или static). Он изменяет объявление, так что объявление объявляет псевдоним типа вместо объекта.

typedef не является ни функцией, ни оператором, поэтому понятия "аргумент", "операнд" или "перегрузка" к нему не применяются. Он просто сообщает компилятору, какую декларацию вы делаете.

В С++ typedef синтаксически определяется как спецификатор decl, он не является спецификатором класса хранения. Спецификаторы класса хранения также являются спецификаторами decl, а также friend. Я не думаю, что это имеет какое-то практическое значение, это еще один способ сказать то же самое, что говорит C, но это 7.1 стандарта С++, если вы хотите посмотреть сами. Я признаюсь, что это пока что меня озадачивает.

Ответ 3

Ваше первоначальное предположение о синтаксисе typedef, имеющем

typedef type-declaration synonym;
Структура

абсолютно неверна. Синтаксис Typedef не имеет такой структуры и никогда не был.

Синтаксис Typedef - это обычный декларация, как и любое другое объявление на языке C. Ключевое слово typedef - это просто спецификатор объявления, который указывает, что объявленное имя является именем typedef, а не переменной, обозначением функции или чем-то еще.

Вы можете использовать несколько деклараторов в одном объявлении typedef, например

typedef int TInt, *TIntPtr, (*TIntFuncPtr)(void), TIntArr10[10];

Ответ 4

Вместо того, чтобы думать о typedef как о операции, которая принимает два параметра (тип и синоним), рассматривает его как классификатор типа. Чтобы объявить переменную с именем F, которая была указателем функции, принимающей два параметра size_t и возвращающих int, вы должны были бы просто:

int (*F)(size_t, size_t);

Добавьте квалификатор типа typedef и вместо объявления переменной вы объявили псевдоним типа.

Ответ 5

typedef использует синтаксис объявления.

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