Иногда мне нужно использовать целые числа фиксированной ширины для связи с внешними устройствами, такими как ПЛК. Я также использую их для определения битмасок и выполнения манипуляции с битами данных изображения. Стандарт AFAIK C99 определяет целые числа фиксированной ширины, такие как int16_t. Однако компилятор, который я использую, VС++ 2008 не поддерживает C99 и AFAIK. Microsoft не планирует его поддерживать.
Мой вопрос в том, что является наилучшей практикой использования целых чисел фиксированной ширины в С++?
Я знаю, что VС++ определяет нестандартные целые числа фиксированной ширины, такие как __int16, но я не решаюсь использовать нестандартный тип. Будет ли следующий стандарт С++ определять целые числа фиксированной ширины?
Ответ 1
Boost имеет typedef для всех типов C99 и более:
"Boost integer library"
Ответ 2
Вы можете решить эту проблему с помощью некоторых директив #ifdef
.
#ifdef _MSC_VER
typedef __int16 int16_t
#else
#include <stdint.h>
#endif
Ответ 3
Включите файл <stdint.h>
, чтобы получить определения для типов типа uint16_t
. По умолчанию VС++ не поставляется с <stdint.h>
, но вы можете получить этот файл из нескольких мест. Wikipedia перечисляет несколько, и Google найдет вас намного больше.
Ответ 4
Будет ли следующий стандарт С++ определять целые числа фиксированной ширины?
Да.
Как сказал Мехрдад, вы можете использовать #ifdefs
пока. Альтернативой была бы какая-то сложная магия шаблона. У Boost есть что-то в этом направлении, Boost Integer library.
Ответ 5
Я использовал версию D20, принадлежащую Danny Smith, доступную в пакете mingw:
Мне пришлось настроить эту версию для компиляции с некоторыми компиляторами не VC 8 (в основном VC6) - он хорошо меня обслуживал.
Возможно, на днях я расскажу о своей совместимой с VC6 версии. Изменения были довольно незначительными - только некоторые макроопределения для использования VC6 конкретных ключевых слов для 64-битных типов. Если вам не нужна поддержка VC6, версия mingw должна быть все, что вам нужно.
Ответ 6
Существуют разные пути. В большинстве сред будет установлено, что short int
- 16 бит, а long int
- 32. (long
подразумевается, когда вы просто объявляете int
.) Если вы typedef
ваш собственный тип int16, вы, вероятно, закончите используя short int
.
Другая возможность заключается в полях бит в структурах. Вы можете сказать что-то вроде:
struct x {
int a : 16;
int b : 5;
...
};
И так далее. Если вы затем определите:
struct x myvar;
myvar.a = 54;
Вы можете быть уверены, что myvar.a будет содержать 16 бит, а myvar.b будет использовать 5; общий размер myvar, округляющий для всех битов, плюс, конечно, размер любых других полей.