To wydaje się proste pytanie, ale nie mogę go znaleźć w wyszukiwaniu przepełnienia stosu lub w Google. Co oznacza typ, po którym następuje środek _t
? Jak na przykład
int_t anInt;
Widzę to często w kodzie C, który ma ściśle współpracować ze sprzętem - nie mogę nie myśleć, że są ze sobą powiązane.
c
naming-conventions
types
Kevin Griffin
źródło
źródło
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.Odpowiedzi:
Jak zauważył Douglas Mayle, w zasadzie oznacza nazwę typu. W związku z tym nie zaleca się kończenia nazw zmiennych lub funkcji znakiem „
_t
”, ponieważ może to powodować pewne zamieszanie. Jak równieżsize_t
tego, C89 norma określawchar_t
,off_t
,ptrdiff_t
i prawdopodobnie kilka innych zapomniałem. Średnia C99 określa wiele dodatkowych typów, takich jakuintptr_t
,intmax_t
,int8_t
,uint_least16_t
,uint_fast32_t
, i tak dalej. Te nowe typy są formalnie zdefiniowane w,<stdint.h>
ale najczęściej będziesz ich używać,<inttypes.h>
co (wyjątkowo w przypadku standardowych nagłówków C) obejmuje<stdint.h>
. (<inttypes.h>
) Definiuje również makra do użytku zprintf()
iscanf()
.Jak zauważył Matt Curtis, kompilator nie ma znaczenia w sufiksie; jest to konwencja zorientowana na człowieka.
Należy jednak pamiętać, że POSIX definiuje wiele dodatkowych nazw typów kończących się na „
_t
” i rezerwuje przyrostek do implementacji. Oznacza to, że jeśli pracujesz w systemach związanych z POSIX, nie zaleca się definiowania własnych nazw typów zgodnie z konwencją. System, nad którym pracuję, już to działa (od ponad 20 lat); regularnie jesteśmy zaskoczeni przez systemy definiujące typy o tej samej nazwie, co my.źródło
abbr_xxxxx_t
nazw typów. Bez takiego prefiksu możesz zostać złapany w dowolnym momencie. Ogólnie rzecz biorąc, znormalizowane_t
typy używają wszystkich małych liter (FILE
iDIR
są to dwa wyjątki, dwa razy - wszystkie wielkie litery i nie_t
), więc możesz używaćCamelCase_t
z umiarkowanym bezpieczeństwem, z wiodącymi lub bez wielkich liter . System, nad którym głównie pracuję, zwykle żyje niebezpiecznie i używa go_t
, ale czasami nas gryzie. Zwykle używamCamelCase
bez przyrostka do własnej pracy; moje funkcje są zwykle wszystkie małe.Jest to konwencja używana do nazewnictwa typów danych, np. Z
typedef
:źródło
_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)):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 typemfoo_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!
źródło
Jest to standardowa konwencja nazewnictwa dla typów danych, zwykle definiowana przez typedefs. Wiele kodu C, który zajmuje się rejestrami sprzętowymi, używa standardowych nazw zdefiniowanych przez C99 dla podpisanych i niepodpisanych typów danych o stałym rozmiarze. Zgodnie z konwencją nazwy te znajdują się w standardowym pliku nagłówkowym (stdint.h) i kończą się na _t.
źródło
To tylko konwencja, która oznacza „typ”. Nie oznacza to nic specjalnego dla kompilatora.
źródło
_t
Nie z natury mają żadnego specjalnego znaczenia. Ale stało się powszechne, aby dodać_t
sufiks do typedef.Możesz być bardziej zaznajomiony z powszechnymi praktykami C dla nazewnictwa zmiennych ... Jest to podobne do tego, jak często przykleja się ap z przodu wskaźnika i używa znaku podkreślenia przed zmiennymi globalnymi (jest to nieco mniej powszechne) i używać nazw zmiennych
i
,j
ik
dla zmiennych tymczasowych pętli.W kodzie, w którym ważny jest rozmiar słowa i kolejność, bardzo często stosuje się jawnie zdefiniowane typy niestandardowe, takie jak
BYTE
WORD
(zwykle 16-bitowy)DWORD
(32-bitowy).int_t
nie jest tak dobra, ponieważ definicjaint
różni się w zależności od platformy - więc zint
kim się dostosowujesz? (Chociaż w dzisiejszych czasach większość prac rozwojowych zorientowanych na komputery PC traktuje to jako 32 bity, wiele rzeczy do programowania innych niż PC nadal traktuje int jako 16 bitów).źródło
Oznacza typ.
size_t
jest typem rozmiaru.źródło
Było kilka dobrych wyjaśnień na ten temat. Aby dodać kolejny powód do ponownego zdefiniowania typów:
W wielu projektach osadzonych wszystkie typy są redefiniowane w celu poprawnego określenia danego rozmiaru dla typów i w celu poprawy przenośności na różnych platformach (np. Kompilatory typów sprzętu).
Innym powodem będzie uczynienie kodu przenośnym w różnych systemach operacyjnych i uniknięcie kolizji z istniejącymi typami w systemie operacyjnym, które integrujesz z kodem. W tym celu zazwyczaj dodaje się unikalny (jak to możliwe) prefiks.
Przykład:
źródło
Jeśli masz do czynienia z kodem interfejsu sprzętowego, autor kodu, na który patrzysz, mógł zdefiniować
int_t
liczbę całkowitą o określonym rozmiarze. Standard C nie przypisuje określonego rozmiaru doint
typu (potencjalnie zależy to od kompilatora i platformy docelowej), a użycie określonegoint_t
typu pozwoliłoby uniknąć problemu z przenośnością.Jest to szczególnie ważne w przypadku kodu interfejsu sprzętowego, dlatego być może po raz pierwszy zauważyłeś tam konwencję.
źródło
Na przykład w C99, /usr/include/stdint.h:
_t
zawsze oznacza zdefiniowane przez typedef.źródło