2017-01-03 11 views
6

Будучи пользователем GCC, я только что заметил, что clang поддерживает тип uint24_t (в любом случае он находится в их stdint.h).Как работает uang24_t clang? Могу ли я использовать его вне clang/LLVM?

Как это работает? Я имею в виду, что он поддерживается исключительно внутри страны, как языковое расширение, или он реализован, как класс C++, с некоторой абстракцией более 3 байтов или 16-битным значением и еще одним 8-битным значением? И - насколько возможно «выдернуть» такую ​​реализацию и использовать ее самостоятельно, с GCC?

Примечание:

  • Я ищу, чтобы иметь uint24_t подобный класс в современном C++ (или uint_t<N> в целом); моя альтернатива сворачивает мою собственную.
  • Вы можете s/uint/int/g; если хотите в этом вопросе.
+0

Я на x86-64, лязг 3.9. 1, и grepping через каталог include привел только к результатам для boost. Сообщите свою систему, пожалуйста. – Downvoter

+0

@Downvoter: Я вижу это [здесь] (http://clang.llvm.org/doxygen/stdint_8h-source.html) на самом деле. И - это своего рода страшное прозвище, которое у вас есть. – einpoklum

ответ

3

Это не переносное или стандартное. Он существует только для AVR (который имеет 24-битные адреса) и GCC has it for that architecture, too (начиная с GCC v4.7).

Если архитектура не поддерживает собственное 24-разрядное целое число, то оно не будет определено.

Если вы посмотрите в Clang's stdint.h header file, вы увидите, что 24-разрядные целые определения типов условно включаются только тогда, когда внутренний __INT24_TYPE__ символ определен:

#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

Я не уверен, как «родное» 24-битное целое для AVR, IIRC AVR имеет 8-битные регистры, а 24-битная арифметика реализована аналогично __int128 на x86_64, нет? –

+0

Я не уверен, как это реализовано, @marc, но AVR использует 24-битные значения для адресов, поэтому должен быть какой-то способ представления этих значений. Скорее всего, это необходимо для моделирования арифметических операций, поскольку регистры имеют ширину всего 8 бит. –