Синтаксически, typedef
рассматривается как спецификатор класса хранения, например extern
или static
. Он не определяет класс хранения; это просто определено для удобства. Таким образом, вы можете заменить typedef
на static
и получить объявление с другим смыслом, но похожим синтаксисом и определением того же идентификатора.
У вас есть:
typedef int (*pf) (int, int);
Замена typedef
на static
дает:
static int (*pf) (int, int);
который объявляет указатель на функцию с именем pf
. Версия декларации typedef
также объявляет идентификатор pf
, но как имя типа, а не как объект-указатель.
Имейте в виду, что typedef
не создает новый тип, просто новое имя для существующего типа.Вместо объявления pf
в качестве объекта объявление typedef
делает pf
псевдоним для имени типа int (*)(int, int)
.
Поскольку класс хранения спецификаторы являются необязательными, вы также можете понять сложную typedef
декларации, опуская слово typedef
:
int (*pf) (int, int);
который декларирует pf
как объект типа int (*) (int, int)
.
Вы также можете использовать программу cdecl
, чтобы объяснить сложные объявления, подобные этому. Он не понимает typedef
(как в версии 2.5), но вы можете просто отказаться от typedef
ключевого слова:
$ cdecl
Type `help' or `?' for help
cdecl> explain typedef int (*pf) (int, int);
syntax error
cdecl> explain int (*pf) (int, int);
declare pf as pointer to function (int, int) returning int
cdecl>
Если у вас нет программы cdecl
установленные в вашей системе, есть интернет-версия на http://cdecl.org/
pf - это имя указателя на функцию;) –
Я думаю, что здесь задается вопрос: «Что такое правила *, для чего typedef рассматривает псевдоним. IOW, 'typedef int int32' считает int32 псевдоним. Каковы правила, которые в функции typedef выше того, что 2 из 4 параметров считаются псевдонимом? – Duck
, если вы пишете 'typedef int * name', то' name' является псевдонимом для типа ('int *'), в случае указателя функции это выглядит немного сложнее, но это тот же принцип. –