2015-06-12 18 views
5

Niedawno zacząłem używać biblioteki OpenCL i zauważyłem, że używają one własnych typów liczb całkowitych, takich jak cl_int i cl_uint zamiast int i unsigned int.Dlaczego biblioteki C++ często definiują własne typy pierwotne?

Dlaczego tak jest? Dlaczego nie używają typów, które są domyślnie w języku? Czy jest to dobra praktyka czy istnieją ku temu praktyczne powody (tj. Bardziej czytelny kod)?

+1

Przeważnie dla zgodności krzyżowej x64/x86 lub do zdefiniowania konkretnego warunku. – Bastien

+0

https://en.wikipedia.org/wiki/Not_invented_here –

Odpowiedz

8

Powodem, dla którego zostało to zrobione w przeszłości, jest przenośność. C i C++ nie robią szczególne gwarancje wielkości int, long i short, natomiast projektanci biblioteczne często potrzebują.

Typowym rozwiązaniem jest zdefiniowanie własnych aliasów dla typów danych oraz zmianę definicji opartych na konkretnej platformy, upewniając się, że typ odpowiedniego rozmiaru przyzwyczaja.

Ten problem pochodzi z języka C i został rozwiązany przez wprowadzenie pliku nagłówkowego stdint.h (zmienionego na cstdint w C++). W tym ten nagłówek pozwala zadeklarować typy int32_t, int16_t itd Jednak bibliotek opracowane przed wprowadzeniem stdint.h i bibliotek, które są wymagane do kompilacji na platformach bez tego nagłówka są przy użyciu starego obejścia.

+0

Teraz dużo wyraźniej, dzięki. Czy mógłbyś skierować mnie do jakiejś strony dla konkretnego przykładu, jak zdefiniowałbyś swój własny typ liczb całkowitych, który jest na przykład unsigned i 16 bitów? – Addy

+1

@Addy Zazwyczaj robi się to za pomocą kompilacji warunkowej '# ifdef' i' typedef's w ​​jednym z nagłówków. Dla OpenCL, który jest [cl_platform.h] (https://www.khronos.org/registry/cl/api/1.1/cl_platform.h). Wyszukaj plik dla 'cl_uint', aby zobaczyć, jak jest on zdefiniowany na podstawie platformy. – dasblinkenlight

3

Często jest tak, że różne konfiguracje można konfigurować i propagować w całym kodzie.

Na przykład wiem, że Bullet 3 definiuje btScalar, które (między innymi) jest w zasadzie:

#if defined(BT_USE_DOUBLE_PRECISION) 
typedef double btScalar; 
#else 
typedef float btScalar; 
#endif 

Więc przez cały kod można użyć btScalar zamiast float lub double, a wszystkie przypadki, które mogłyby być przełączane przez zdefiniowanie lub niezdefiniowanie tego makra.

Istnieją inne analogie tego, które obsługują width of integer types, different character sets i inne scenariusze zależne od platformy.

3

Definiując własne typy, mogą bezpiecznie polegać na tym, że te typy zawsze będą miały ten sam rozmiar.

Typy mogą się różnić w zależności od platformy, a kompilator - kompilatora. Chociaż STL zapewnia <cstdint> niektórzy programiści wolą własne definicje, ponieważ nie chcą używać STL.

W większości przypadków można założyć, że int będzie miał 32 bity, ale może się zmienić, i to jest, gdy niektórzy programiści wolą zdefiniować swoje własne wiarygodne typy na podstawie prawdopodobieństwa, że ​​może nie być.

Powiązane problemy