2009-04-09 2 views
19

Иногда мне нужно использовать целые числа фиксированной ширины для связи с внешними устройствами, такими как ПЛК. Я также использую их для определения битмасок и выполнения манипуляции с битами данных изображения. Стандарт AFAIK C99 определяет целые числа фиксированной ширины, такие как int16_t. Однако компилятор, который я использую, VC++ 2008 не поддерживает C99 и AFAIK. Microsoft не планирует его поддерживать.Целые числа фиксированной ширины в C++

Мой вопрос в том, что является лучшей практикой использования целых чисел фиксированной ширины в C++?

Я знаю, что VC++ определяет нестандартные целые числа фиксированной ширины, такие как __int16, но я не решаюсь использовать нестандартный тип. Будет ли следующий стандарт C++ определять целые числа фиксированной ширины?

ответ

12

подталкивания имеет определения типов для всех типов C99 и больше: "Boost integer library"

+1

Обновление для реальных читателей: C++ 11 теперь имеют фиксированные типы размеров: http://en.cppreference.com/w/cpp/types/integer – dkg

18

Вы можете решить эту проблему с помощью некоторых директив #ifdef.

#ifdef _MSC_VER 
    typedef __int16 int16_t 
#else 
    #include <stdint.h> 
#endif 
+0

+1 Умное решение, красиво сделано! –

+3

Просто FYI для будущих читателей, MSVC 2010 имеет ''! – Cameron

7

Включите файл <stdint.h> для получения определений типов, таких как uint16_t. VC++ не поставляется с <stdint.h> по умолчанию, но вы можете получить этот файл из нескольких мест. Wikipedia перечисляет несколько, и Google найдет вас намного больше.

+1

Проблема в том, что stdint.h, как и большинство или всех заголовков C и C++, специфичен для реализации. Определения зависят от реализации. Любой случайный заголовок может работать просто отлично или сбой. –

+3

@David: Это хороший момент, но в этом случае файлы stdint.h, перечисленные на странице Wikipedia, на самом деле специально написаны для MSVC++. –

+0

Итак, мы не говорим о случайных заголовках здесь. Хорошо. –

3

Будет ли следующий стандарт C++ определять целые числа фиксированной ширины?

Да.

Как сказал Мехрдад, на данный момент вы можете использовать #ifdefs. Альтернативой была бы какая-то сложная магия шаблона. У Boost есть что-то в этом направлении, Boost Integer library.

0

Есть разные пути. В большинстве сред будет установлено, что short int s - 16 бит, а long int s - 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, округленный вверх для того, что содержит все биты, плюс, конечно, размер любых других полей.

+0

short обычно 16 бит, но длинные могут быть 32 или 64 бит в современных системах. длинный длинный почти всегда будет 64. –

+0

Давид справа. Если вы пройдете этот маршрут, я бы включил в него что-то вроде «assert (sizeof (short) == 2)». –

+0

Длинные теории могут быть 64 бит. Я никогда не работал с 64-битной машиной, но мое впечатление было, что большинство компиляторов все еще сохраняют длинные позиции в 32 и заставляют вас долго использовать 64. Сложная вещь, я думаю, все это определяется реализацией независимо от соглашений , – Peter

1

Я использовал публичный домен (не GPL - истинное общественное достояние) версии stdint.h Дэнни Смит, которая доступна в пакете MinGW :

мне пришлось подправить эту версию для компиляции с некоторыми не VC 8 компиляторами (в основном vc6) - он служил мне хорошо.

Возможно, на днях я смогу опубликовать версию, совместимую с VC6. Изменения были довольно незначительными - только некоторые макроопределения для использования VC6 конкретных ключевых слов для 64-битных типов. Если вам не нужна поддержка VC6, версия для mingw, вероятно, должна быть все, что вам нужно.

Смежные вопросы