Этот вопрос уже имеет ответ здесь:
Я смущен, когда должен я добавлять запаздывание _t
кому: typedef
'типы редактора?
Например, если я делаю это:
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;
Просветите меня.
Спасибо, Boda Cydo.
В POSIX имена, заканчивающиеся на _t
, зарезервированы, поэтому, если вы ориентируетесь на систему POSIX (например, Linux), вам не следует заканчивать свои типы с _t
.
Я лично презираю соглашение _t
. Однако до тех пор, пока вы последовательны, это не имеет значения.
Обратите внимание, что (как показывают другие ответы здесь), если вы кодируете под какой-то другой стандарт, например POSIX, вам нужно проверить, все ли в порядке в этом стандарте, прежде чем использовать такие имена.
Я использую _t
суффикс для перечислений и примитивных типов, чтобы отличать их от переменных. Я помещаю их в пространства имен, поэтому меня не волнуют оговорки _t
.
Для обоснования. Очень часто имя переменной является аллюзией на типизированный тип. Например, std::size_t size;
, array_t array
и т.д. Я обнаружил, что легче подобрать достойное имя для переменной, когда тип содержит суффикс _t
. Это также напоминает мне, что это типизированный примитив, а не какой-нибудь другой зверь, например, класс.
Выбирайте хорошие имена для ваших типов, как и для ваших переменных, функций и всего остального. Хорошее имя не имеет встроенной избыточной информации, которая затрудняет чтение кода - _t никогда не поможет вам, если у вас есть хорошее имя для начала.
Между прочим: typedef image image;
не имеет никакого смысла, поскольку он просто превращает изображение в typedef для самого себя.
Когда следует использовать _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 с тем же предполагаемым использованием только запутывает и служит для блокировки разработчиков в вашей библиотеке/платформе, загрязняя весь код этими нестандартными именами типов.