_t
Обычно оборачивает непрозрачное определение типа.
GCC просто добавляет имена, оканчивающиеся _t
на зарезервированное пространство имен, которое вы не можете использовать, чтобы избежать конфликтов с будущими версиями Standard C и POSIX (руководство по библиотеке GNU C) . После некоторых исследований я наконец нашел правильную ссылку в стандарте POSIX (1003.1, Обоснование (информативное)):
B.2.12 Типы данных
Требование, чтобы дополнительные типы, определенные в этом разделе, заканчивались на '' _t '', было вызвано проблемой загрязнения пространства имен. Сложно определить тип (где этот тип не определен IEEE Std 1003.1-2001) в одном заголовочном файле и использовать его в другом без добавления символов в пространство имен программы. Чтобы позволить разработчикам предоставлять свои собственные типы, все соответствующие приложения должны избегать символов, заканчивающихся на «_t», что позволяет разработчику предоставлять дополнительные типы. Поскольку основное использование типов заключается в определении элементов структуры, которые могут (и во многих случаях должны) добавляться к структурам, определенным в стандарте IEEE Std 1003.1-2001, необходимость в дополнительных типах очевидна.
В двух словах, Стандарт говорит, что есть хорошие шансы на расширение списка типов Стандартов, поэтому Стандарт ограничивает _t
пространство имен для собственного использования.
Например, ваша программа соответствует POSIX 1003.1 Issues 6, и вы определили тип foo_t
. POSIX 1003.1 Проблемы 7 в конечном итоге выпущены с новым определенным типом foo_t
. Ваша программа не соответствует новой версии, что может быть проблемой. Ограничение _t
использования предотвращает рефакторинг кода. Таким образом, если вы стремитесь к соответствию POSIX, вам определенно следует избегать того, _t
что указано в Стандарте.
Примечание: лично я стараюсь придерживаться POSIX, потому что я думаю, что он дает хорошие основы для чистого программирования. Более того, мне очень нравятся рекомендации по стилю кодирования Linux (глава 5) . Есть несколько веских причин, почему не использовать typedef. Надеюсь, это поможет!
int_t
определяется? Если это всегда определено какint
, это не полезно; гораздо понятнее использоватьint
напрямую. Если это не всегда определяется какint
(скажем, если это может бытьlong int
илиshort int
), то это плохо выбранное и запутанное имя.