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