Jeśli chcesz korzystać z Qt , trzeba ogarnąć quint8
, quint16
i tak dalej.
Jeśli chcesz użyć wygadany , trzeba powitanie guint8
, guint16
i tak dalej.
Na Linuksie istnieją u32
, s16
i tak dalej.
uC / OS definiuje SINT32
, UINT16
i tak dalej.
A jeśli musisz użyć jakiejś kombinacji tych rzeczy, lepiej bądź przygotowany na kłopoty. Ponieważ na komputerze u32
zostaną typedef
d nad long
i quint32
będą typedef
dni nad int
i kompilator będzie narzekać .
Dlaczego wszyscy to robią, jeśli tak jest <stdint.h>
? Czy to jakaś tradycja dla bibliotek?
stdint.h
został wymyślony.sizeof(int) * CHAR_BIT
(na przykład) i użyć tego? Jeśli twójint
jest zbyt mały, aby reprezentować twój zakres (np. Indeks tablicy), prawie na pewno nie powinieneś go używaćint
, ale coś w stylusize_t
. Dlaczego miałoby toint32
mieć większy sens? Jedynym sensem, jaki ma ustalona szerokość, jest komunikacja między systemami (np. Format pliku / sieci) ...uint16_t
(a może tofast
lubleast
wariant). Chodzi mi o to: te typy są wygodne w użyciu i mają swoją rację istnienia.size_t
i / lubuint64_t
.Odpowiedzi:
stdint.h
nie istniało, kiedy te biblioteki były rozwijane. Więc każda biblioteka stworzyła własnetypedef
pliki.źródło
W przypadku starszych bibliotek jest to potrzebne, ponieważ dany nagłówek (
stdint.h
) nie istniał.Wciąż jednak jest problem: te typy (
uint64_t
i inne) są opcjonalną funkcją w standardzie. Zatem zgodna implementacja może nie zostać dostarczona wraz z nimi - a tym samym zmusić biblioteki do ich uwzględnienia w dzisiejszych czasach.źródło
uintN_t
typy są opcjonalne, aleuint_leastN_t
iuint_fastN_t
typy nie są.stdint.h
został znormalizowany od 1999 roku. Jest bardziej prawdopodobne, że wiele aplikacji definiuje (efektywnie aliasy) typy, aby zachować częściową niezależność od podstawowej architektury maszyny.Dają programistom pewność, że typy używane w ich aplikacjach odpowiadają założeniom projektu dotyczącym zachowania, które może nie odpowiadać standardowi języka lub implementacji kompilatora.
Praktyka ta znajduje odzwierciedlenie we wzorcu projektowym elewacji zorientowanym obiektowo i jest bardzo nadużywana przez programistów, którzy niezmiennie piszą klasy opakowujące dla wszystkich importowanych bibliotek.
Gdy elementy zgodne były znacznie mniej standardowe, a architektury maszyn mogły różnić się od 16-bitowych, 18-bitowych do 36-bitowych mainframe'ów o długości słowa, było to znacznie ważniejsze. Ta praktyka jest teraz znacznie mniej istotna w świecie konwergencji na 32-bitowych wbudowanych systemach ARM. Pozostaje problemem dla słabszych mikrokontrolerów z dziwnymi mapami pamięci.
źródło
stdint.h
jest standaryzowany od 1999 r., Ale od jak dawna jest dostępny w praktyce? Ludzie ociągają się wdrażając i przyjmując nowe standardy, a podczas tego długiego okresu przejściowego stare metody są nadal konieczne.stdint.h
jest to, że nawet na platformach gdzie na przykładlong
iint32_t
mają tę samą wielkość i reprezentacji, nie ma wymogu, że oddająceint32_t*
dolong*
przyniesie wskaźnik, który może w wiarygodny sposób uzyskać dostęp doint32_t
. Nie mogę uwierzyć, że autorzy Standardu uważali za oczywiste, że typy zgodne z układem powinny być zgodne z aliasami, ale ponieważ nie zawracali sobie głowy stwierdzeniem, że autorzy gcc i IIRC twierdzą, że język zostałby ulepszony nawet przez ignorowanie aliasów w przypadkach, gdy jest to oczywiste.-fno-strict-alias
, który byłby znacznie wydajniejszy niż byłby możliwy z , ale który nadal działałby. Nawet gdyby nie istniała baza kodu, żaden pojedynczy zestaw reguł nie byłby w stanie zapewnić optymalnej równowagi optymalizacji i semantyki dla wszystkich aplikacji, ponieważ różne aplikacje mają różne potrzeby. Dodaj istniejącą bazę kodów, a potrzeba różnych trybów powinna być jasna.Masz więc możliwość wpisania wartości char na int.
Jeden z "horrorów związanych z kodowaniem" wspomniał, że jeden nagłówek firmy zawierał punkt, w którym programista chciał wartości logicznej, a znak był logicznym rodzimym typem zadania, i tak napisał
typedef bool char
. Później ktoś znalazł liczbę całkowitą jako najbardziej logiczny wybór i napisałtypedef bool int
. Rezultat, na wieki przed Unicode, był praktycznietypedef char int
.Myślę, że całkiem sporo przyszłościowego myślenia i kompatybilności.
źródło