в C (ANSI, C99 и т. д.) структуры живут в своем собственном пространстве имен. Структура для связанного списка может выглядеть примерно так:
struct my_buffer_type {
struct my_buffer_type * next;
struct my_buffer_type * prev;
void * data;
};
Тем не менее, для большинства программистов на C вполне естественно автоматически вводить такие структуры, как показано ниже:
typedef struct tag_buffer_type {
struct tag_buffer_type * next;
struct tag_buffer_type * prev;
void * data;
} my_buffer_type;
А потом ссылаться на - структуру , как нормальный тип, то есть get_next_element(my_buffer_type * ptr)
.
Теперь мой вопрос: есть ли для этого конкретная причина?
Википедия говорит http://en.wikipedia.org/wiki/Typedef#Usage_concerns
Некоторые люди против широкого использования typedefs. Большинство аргументов основаны на идее, что typedefs просто скрывают фактический тип данных переменной. Например, Грег Кроа-Хартман (Greg Kroah-Hartman), хакер и документалист по ядру Linux, не рекомендует их использовать для чего-либо, кроме объявлений прототипов функций. Он утверждает, что эта практика не только излишне запутывает код, но также может заставить программистов случайно неправильно использовать большие структуры, считая их простыми типами. [4]
Другие утверждают, что использование typedefs может облегчить поддержку кода. K & R утверждает, что есть две причины для использования typedef. Во-первых, это дает возможность сделать программу более переносимой. Вместо того, чтобы менять тип везде, где он появляется в исходных файлах программы, нужно изменить только один оператор typedef. Во-вторых, typedef может облегчить понимание сложной декларации.
Я лично задаюсь вопросом: struct
неужели нет достаточного преимущества наличия отдельного пространства имен, чтобы иногда не использовать структуры typedef'd, и поскольку существует несколько культур программирования C (в моем опыте программирование на Windows C отличается от традиций Linux C), если есть другие традиции, о которых я не знаю.
Тогда меня интересуют исторические соображения (предшественники, первые версии C).
typedef
- скрыть фактический тип переменной. Возьмитеtime_t
в качестве примера: если люди будут использовать базовый целочисленный тип, то такое изменение в реализации, которое потребовалось в 2038 году, сломает очень много кода. «Если люди используют структуры, не понимая, почему, это ошибка программиста, а не конструкции.