Фундаментальный синтаксис операнда типа - PullRequest
16 голосов
/ 24 сентября 2010

Дано:

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 и C ++, пожалуйста, уточните иначе, в первую очередь меня интересует C ++, если это поможет.

Ответы [ 5 ]

31 голосов
/ 24 сентября 2010

Объявления типов с использованием 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)'

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

7 голосов
/ 24 сентября 2010

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

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

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

2 голосов
/ 24 сентября 2010

Ваше первоначальное предположение о синтаксисе typedef со структурой

typedef type-declaration synonym;

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

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

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

typedef int TInt, *TIntPtr, (*TIntFuncPtr)(void), TIntArr10[10];
1 голос
/ 24 сентября 2010

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

int (*F)(size_t, size_t);

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

0 голосов
/ 24 сентября 2010

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

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

...