typedef в c: ссылка на структуру или функцию? - PullRequest
1 голос
/ 27 апреля 2020

Анализируя часть программного обеспечения, написанного кем-то другим, я нашел следующую строку кода:

typedef const struct rpc_method *(*super_t)(RPC*);

Хорошо, я знаю,

typedef rpc_method *(*super_t)(RPC*);

объявляет тип super_t который является указателем на функцию ... Я также знаю, что означает typedef struct, но комбинация двух ?? Это структура с одной записью ??? А что значит const в этом контексте ?? Может ли быть так, что const и struct обмениваются ??? Тем не менее, похоже, скомпилируется с моим g cc eabi.

1 Ответ

0 голосов
/ 27 апреля 2020

Если объявление без 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 без изменения семантики.

Подробнее:

{ ссылка }

...