почему этот указатель Typedef'd на структуру - PullRequest
0 голосов
/ 28 мая 2018

Я просматривал код для различных систем IPC и случайно встретил эти строки в Mach (xnu-123.5 / osfmk / ipc / ipc_port.h)

typedef port_name_t          mach_port_name_t;
typedef mach_port_name_t    *mach_port_name_array_t;

где определениеport_name_t является структурой.

Мне еще не приходилось сталкиваться с любым использованием *mach_port_name_array_t, и я был просто немного удивлен, увидев указатель typedef'd на структуру, какое-либо понимание того, почему это было сделано?или просто некоторый пример кода, показывающий *mach_port_name_array_t в действии, был бы очень признателен.

1 Ответ

0 голосов
/ 28 мая 2018

Я [...] был немного удивлен, увидев указатель typedef'd на структуру

Я бы не описал объявление, которое вы представили.Рассмотрим код

typedef mach_port_name_t    *mach_port_name_array_t;

Если бы ключевое слово typedef отсутствовало, тогда оно объявило бы mach_port_name_array_t как указатель на объект типа mach_port_name_t, который оказываетсятип конструкции.Указатели на структуры являются в C обычным делом, поскольку в C имеется встроенный оператор (->) для доступа к членам структуры через указатель.

Добавление typedef просто делает объявленный идентификатор(mach_port_name_array_t) псевдоним типа для этого типа вместо объекта этого типа.Вы можете сделать это, чтобы создать псевдоним типа для любого типа, поэтому создание псевдонима для типа указатель на структуру совершенно допустимо.

С другой стороны, хотя создание псевдонимов типов не так уж редко,это плохой стиль.В большинстве случаев typedef, которые скрывают природу указателя типа, производят больше путаницы, чем ясности.Соглашения об именах могут помочь с этим, но не настолько, как отказ от таких типов.

Более того, в данном конкретном случае имя вводит в заблуждение.Это предполагает, что тип является типом массива, когда это не так.Однако это правильный тип указателя для параметра функции, фактический аргумент которого должен быть массивом:

void do_something_with_ports(mach_port_name_array_t port_names);

// ...

mach_port_name_t ports[3];

// ...

do_something_with_ports(ports);

Однако, как я уже сказал, использование указателя typedef будет плохим стилем.Функция была бы лучше объявлена ​​так:

void do_something_with_ports(mach_port_name_t *port_names);

или, что эквивалентно,

void do_something_with_ports(mach_port_name_t port_names[]);
...