_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), то это плохо выбранное и запутанное имя.