_t
Zazwyczaj owija nieprzezroczystą definicji typu.
GCC po prostu dodaje nazwy kończące się _t
do zarezerwowanej przestrzeni nazw, której nie możesz używać, aby uniknąć konfliktów z przyszłymi wersjami Standard C i POSIX (podręcznik biblioteki GNU C) . Po kilku badaniach w końcu znalazłem prawidłowe odniesienie w standardzie POSIX (1003.1, uzasadnienie (informacyjne)):
B.2.12 Typy danych
Wymaganie, aby dodatkowe typy zdefiniowane w tej sekcji kończyły się na „_t”, wynikało z problemu zanieczyszczenia przestrzeni nazw. Trudno jest zdefiniować typ (gdzie ten typ nie jest zdefiniowany przez IEEE Std 1003.1-2001) w jednym pliku nagłówkowym i użyć go w innym, bez dodawania symboli do przestrzeni nazw programu. Aby umożliwić implementatorom udostępnianie własnych typów, wszystkie zgodne aplikacje są wymagane, aby uniknąć symboli kończących się na „_t”, co pozwala implementatorowi na dostarczenie dodatkowych typów. Ponieważ głównym zastosowaniem typów jest definicja elementów konstrukcyjnych, które można (i w wielu przypadkach trzeba) dodać do struktur zdefiniowanych w IEEE Std 1003.1-2001, potrzeba dodatkowych typów jest przekonująca.
W skrócie, Standard mówi, że istnieją duże szanse na rozszerzenie listy typów Standardów, dlatego Standard ogranicza _t
przestrzeń nazw do własnego użytku.
Na przykład twój program pasuje do POSIX 1003.1 Problem 6 i zdefiniowałeś typ foo_t
. POSIX 1003.1 Problem 7 zostaje ostatecznie wydany z nowo zdefiniowanym typem foo_t
. Twój program nie pasuje do nowej wersji, co może być problemem. Ograniczenie _t
użycia zapobiega refaktoryzacji kodu. Dlatego jeśli dążysz do zgodności z POSIX, zdecydowanie powinieneś unikać tego, _t
co określa Standard.
Uwaga dodatkowa: osobiście staram się trzymać POSIX, ponieważ myślę, że daje to dobre podstawy dla czystego programowania. Co więcej, bardzo lubię wytyczne dotyczące Linux Coding Style (rozdział 5) . Istnieje kilka dobrych powodów, dla których nie należy używać typedef. Mam nadzieję, że to pomoże!
int_t
zdefiniowane? Jeśli jest zawsze zdefiniowane jakoint
, nie jest użyteczne; korzystanie z niego jest znacznie łatwiejszeint
. Jeśli nie zawsze jest zdefiniowane jakoint
(powiedzmy, czy może byćlong int
lubshort int
), to jest to źle wybrana i myląca nazwa.