Dlaczego tak wiele bibliotek określają swoje własne liczby stałej szerokości?

0

Pytanie

Ponieważ, przynajmniej w C++11, otrzymaliśmy piękne liczb całkowitych o stałej szerokości, np. w C++ <cstdint> lub w literach "Z" <stdint.h> po wyjęciu z pudełka, (np. std::uint32_t, std::int8_t), więc z lub bez std:: przed nimi, a nawet jako makr dla minimalnej szerokości (INT16_C, UINT32_C i tak dalej).

Jednak każdego dnia mamy do czynienia z bibliotekami, które określają swoje własne liczby stałej szerokości, a może widzieliście, np. sf::Int32, quint32, boost::uint32_t, Ogre::uint32, ImS32, ... Mogę tak wymieniać w nieskończoność, jeśli chcesz. Ty też pewnie wiesz jeszcze kilka.

Czasami te różnice typów (również często definicje makr) mogą prowadzić do konfliktów, na przykład, gdy chcesz przekazać std liczba całkowita o stałej szerokości do funkcji z biblioteki, która oczekuje liczba całkowita o stałej szerokości z dokładnie tej samej szerokości, ale pewnego inaczej.

Sens liczb całkowitych o stałej szerokości w tym, że mają stały rozmiar, co, jak wiesz, musimy się w wielu sytuacjach. Dlaczego więc wszystkich tych bibliotek wykorzystać i wprowadzić dokładnie takie same liczby, które mamy już w standardzie C++? Te dodatkowe określenia czasami są mylące, przesadne i mogą wtrącać się w waszą bazę kodu, że jest bardzo źle. I jeśli nie mają tej szerokości i sztywności, które obiecują, są, co najmniej, grzeszą przeciwko zasady najmniejszego zdziwienia, więc jaki jest ich sens, pytam się was?

c++ fixed-width integer
2021-11-23 14:45:24
1

Najlepsza odpowiedź

5

Dlaczego tak wiele bibliotek określają swoje własne liczby stałej szerokości?

Prawdopodobnie, według niektórych z następujących powodów:

  • rozpoczęły się one do C++11 lub C11 (przykłady: GTK, Qt, biblioteki, wewnętrzne dla GCC, Boost, FLTK, GTKmm, Jsoncpp, Eigen, Dlib, OpenCV, Wt)

  • chcą mieć czytelny kod w swoich własnych namespace lub class (posiadanie własnej przestrzeni nazw, jak Qt, może poprawić czytelność dobrze napisanego kodu).

  • są one instalowane podczas montażu (np. za pomocą GNU autoconf).

  • chcą być компилируемыми ze starymi kompilatory C++ (na przykład, niektóre kompilatory C++03)

  • chcą być скомпилируемыми dla tanich wbudowanych mikrokontrolerów, których kompilator nie jest kompletny kompilator C++11.

  • mogą mieć wspólny kod (lub template-s, np. w Eigen lub Dlib), być może, w celu wsparcia działań arytmetycznych dowolnej precyzji (lub liczb), być może z wykorzystaniem GMPlib.

  • chcą być w jakiś sposób доказуемыми z certyfikatem Frama-C lub DO-178C (dla wbudowanych krytycznych systemów oprogramowania).

  • zależą one od procesora (na przykład, asmjit, który generuje kod maszynowy w czasie wykonywania na kilka architektur).

  • mogą one komunikować się ze sprzętem lub języków programowania (Tensorflow, OpenCL, Cuda).

  • chcą, aby ich można było korzystać za pomocą Python lub GNU guile.

  • mogą być specyficzne dla systemu operacyjnego.

  • dodają kilka dodatkowych kontroli w czasie wykonywania, na przykład, przeciwko dzielenia przez 0 (lub innego nieokreślonego zachowania) lub przepełnienia (że standard C++ nie może żądać, ze względu na wydajność lub historii)

  • są one przeznaczone do łatwego korzystania z kodu maszynowego C++ (na przykład, RefPerSys, ANTLR, ...)

  • są one przeznaczone do połączenia z kodu C (np. libgccjit).

  • itd... Szukaj innych dobrych powodów pozostawione czytelnikowi jako ćwiczenie.

2021-11-24 08:35:11

Dobra, wygrałeś. Ja nie będę przewracanie oczami za każdym razem, gdy zobaczę, jak to jest.
nada

U mnie jest tak dużo kodu, odpowiedniej do pierwszego kroku, że to nie jest śmieszne.
user4581301

W innych językach

Ta strona jest w innych językach

Русский
..................................................................................................................
Italiano
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................