В целом, это плохая практика.Существенная проблема заключается в том, что она не очень хорошо играть с const
:
typedef type_t *TYPE;
extern void set_type(TYPE t);
void foo(const TYPE mytype) {
set_type(mytype); // Error expected, but in fact compiles
}
Для того, чтобы автор foo()
, чтобы выразить то, что они на самом деле означает, библиотека, которая предоставляет TYPE
также должны обеспечить CONST_TYPE
:
typedef const type_t *CONST_TYPE;
, так что foo()
может иметь подпись void foo(CONST_TYPE mytype)
, и в этот момент мы спустились в фарс.
Отсюда правило:
сделать из определений типов структур (в частности, неполные структуры), а не указатели на эти структуры.
Если определение базовой структуры не должна быть общедоступными (который часто похвально), то, что инкапсуляция должна быть поставлена структурами является неполным, а не неудобными определениями типов:
struct type_t;
typedef struct type_t type_t;
void set_type(type_t *);
int get_type_field(const type_t *);
Confusions Confusions! –
Только один из ответов «Указатели Typedef - хорошая идея?» ссылается на бесполезное взаимодействие с 'const' - и этот ответ с низким рейтингом. ИМХО проблема 'const' является самой значительной проблемой с этими типами typedefs ... следовательно, не является действительно дубликатом. –
@John: Я не согласен с вами заключение. Вы отметили, что ответ, добавленный после того, как задан вопрос, не получил большого внимания, но вопросы по-прежнему принципиально одинаковы. – dmckee