2017-01-03 9 views
6

Będąc użytkownikiem GCC, właśnie zauważyłem, że klang obsługuje typ uint24_t (w każdym razie jest to ich stdint.h).Jak działa uint24_t clang? Czy mogę go używać poza CLL/LLVM?

Jak to działa? Mam na myśli, czy jest on obsługiwany wyłącznie wewnętrznie, jako rozszerzenie języka, czy jest zaimplementowany tak jak klasa C++, z pewną abstrakcją ponad 3 bajty lub 16-bitową wartością i inną 8-bitową wartością? I jak to możliwe, aby "szarpać" taką implementację i używać jej samodzielnie, z GCC?

Uwaga:

  • szukam mieć klasę uint24_t-jak w nowoczesnych C++ (lub uint_t<N> bardziej ogólnie); moja alternatywa toczy moje własne.
  • Możesz s/uint/int/g;, jeśli chcesz w tym pytaniu.
+0

jestem na x86-64, dzyń 3.9. 1, a przeglądanie katalogu zawierającego tylko dało wyniki dla zwiększenia. Zgłoś swój system, proszę. – Downvoter

+0

@ Dvvvoter: Właśnie to widzę [tutaj] (http://clang.llvm.org/doxygen/stdint_8h-source.html). I - to rodzaj przerażającego ksywki, którą masz. – einpoklum

Odpowiedz

3

To nie jest przenośne ani standardowe. Istnieje tylko dla AVR (który ma 24-bitowe adresy) i GCC has it for that architecture, too (od GCC v4.7).

Jeśli architektura nie obsługuje natywnej 24-bitowej liczby całkowitej, nie zostanie ona zdefiniowana.

Jeśli spojrzeć na Clang's stdint.h header file, zobaczysz, że 24-bitowe typedefs całkowitymi są warunkowo włączone tylko wtedy, gdy wewnętrzny __INT24_TYPE__ symbol jest zdefiniowany:

#ifdef __INT24_TYPE__ 
typedef __INT24_TYPE__ int24_t; 
typedef __UINT24_TYPE__ uint24_t; 
typedef int24_t int_least24_t; 
typedef uint24_t uint_least24_t; 
typedef int24_t int_fast24_t; 
typedef uint24_t uint_fast24_t; 
# define __int_least16_t int24_t 
# define __uint_least16_t uint24_t 
# define __int_least8_t int24_t 
# define __uint_least8_t uint24_t 
#endif /* __INT24_TYPE__ */ 
+0

Nie jestem pewien, jak "natywna" jest 24-bitowa liczba całkowita dla AVR, IIRC AVR ma 8-bitowe rejestry, a 24-bitowa arytmetyka jest zaimplementowana podobnie do __int128 na x86_64, nie? –

+0

Nie jestem właściwie pewien, w jaki sposób jest zaimplementowany, @marc, ale AVR używa 24-bitowych wartości dla adresów, więc musi istnieć jakiś sposób reprezentowania tych wartości. Prawdopodobnie musi symulować operacje arytmetyczne, ponieważ rejestry mają tylko 8 bitów szerokości. –

Powiązane problemy