Если объявление без typedef
объявит переменную IDENTIFIER
как объект типа TYPE
, объявление с typedef
объявит IDENTIFIER
как тип псевдоним для типа TYPE
(т. е. тот же тип, который будет иметь переменная в том же объявлении без typedef
).
Так, учитывая, что
struct rpc_method const*(*super_t)(RPC*);
объявляет super_t
в качестве указателя на функцию, принимающую указатель на RCP
и возвращающую указатель на struct rpc_method const
,
typedef struct rpc_method const*(*super_t)(RPC*);
объявляет super_t
в качестве псевдонима типа для указанного выше указателя (для функции беря указатель на RCP
и возвращая указатель на struct rpc_method const
).
const
в приведенном выше объявлении квалифицирует цель возвращаемого типа, независимо от того, записали ли вы ее как struct rpc_method const*
или const struct rpc_method*
(размещение квалификатора справа от типа works делает его более совместимым с квалификаторами, вставленными в другие ссылки цепочечного указателя, например, в struct foo const * const * volatile bar
последние два const
и volatile
должны быть справа стороны их *
, в то время как первый const
мог go слева от struct foo
без изменения семантики.
Подробнее:
{ ссылка }