Ответ 1
В POSIX имена, заканчивающиеся на _t
, зарезервированы, поэтому, если вы нацеливаете систему POSIX (например, Linux), вы не должны заканчивать свои типы с помощью _t
.
Я запутался, когда следует добавить конечные _t
to typedef
'ed типы?
Например, должен ли я сделать это:
typedef struct image image_t;
или это:
typedef struct image image;
Каковы общие правила?
Другой пример: должен ли я сделать это:
typdef enum { ARRAY_CLOSED, ARRAY_OPEN, ARRAY_HALFOPEN } array_type_t;
или это:
typdef enum { ARRAY_CLOSED, ARRAY_OPEN, ARRAY_HALFOPEN } array_type;
Пожалуйста, просветите меня.
Спасибо, Бода Сидо.
В POSIX имена, заканчивающиеся на _t
, зарезервированы, поэтому, если вы нацеливаете систему POSIX (например, Linux), вы не должны заканчивать свои типы с помощью _t
.
Я лично презираю соглашение _t
. До тех пор, пока вы последовательны, это действительно не имеет значения.
Обратите внимание, что (как указывают другие ответы здесь), если вы кодируете какой-либо другой стандарт, например POSIX, вам нужно проверить, хорошо ли это в этом стандарте перед использованием таких имен.
Когда следует использовать _t
? Никогда? Он зарезервирован по основному стандарту (POSIX), и даже если это не так, ваш код может когда-нибудь использоваться в среде POSIX, поэтому использование _t
- плохая идея.
Я хотел бы далее сказать, что чрезмерное использование typedef
плохое в целом. Если ваш тип struct
, union
или enum
, используйте эти ключевые слова, когда вы объявляете переменные, и это делает ваш код более понятным. Использование typedef
лучше всего зарезервировано для того, чтобы сделать основной тип невидимым для целей абстрагирования/инкапсуляции. Несколько отличных примеров из стандарта C: size_t
, int32_t
, mbstate_t
и stdio FILE
.
Некоторые из худших злоупотреблений typedef
относятся к Windows API (WORD
, DWORD
, INT
, LPSTR
и т.д.) и glib (gint
, gchar
и т.д.)., Создание дубликатов стандартных типов C с таким же предполагаемым использованием является только запутанным и служит для блокировки разработчиков в вашей библиотеке/платформе, загрязняя весь код этими нестандартными именами типов.
Я использую суффиксы для повышения удобочитаемости: _t для typedef и _e для перечислений с 25/30 лет... иногда я использую _st, когда typedef определяет структуру.
Я думаю, что это хорошая практика, чтобы код был читаемым и стандартизованным, тогда я нахожу право использовать суффиксы! Кроме того, на сегодняшний день я не нашел официального документа POSIX, в котором говорится, что суффикс _t зарезервирован.
Старый stdio.h содержит _t... См. grep -i "_t;" stdio.h:) Я думаю, что стандарт POSIX "немного" моложе, чем C!
Я использую суффикс _t
для перечислений и примитивных типов, чтобы отличать их от переменных. Я помещаю их в пространства имен, поэтому мне не нужно резервировать _t
.
Чтобы оправдать это. Очень часто переменное имя представляет собой намек на типизированный тип. Как std::size_t size;
, array_t array
и т.д. Я обнаружил, что легче подобрать достойное имя для переменной, когда тип содержит суффикс _t
. Это также напоминает мне, что это типизированный примитив, а не какой-то другой зверь, например, класс.
Выберите хорошие имена для ваших типов, как и ваши переменные, функции и все остальное. Хорошее имя не содержит избыточной информации, которая усложняет чтение кода. _t никогда не помогает вам, если у вас есть доброе имя для начала.
Кстати: typedef image image;
не имеет никакого смысла, так как он просто делает образ typedef для себя.