Кросс-платформенные примитивные типы данных в С++

В отличие от Java или С#, примитивные типы данных на С++ могут отличаться по размеру в зависимости от платформы. Например, int не гарантируется как 32-разрядное целое число. Различные среды компилятора для этой цели определяют типы данных, такие как uint32 или dword, но, похоже, нет стандартного файла include для типов данных фиксированного размера.

Каков рекомендуемый метод для достижения максимальной переносимости?

Ответ 1

Я нашел этот заголовок особенно полезным: BOOST cstdint

Обычно лучше, чем изобретать собственное колесо (которое требует обслуживания и тестирования).

Ответ 2

Создайте файл заголовка с именем types.h и определите все необходимые вам примитивные типы фиксированного размера (int32, uint32, uint8 и т.д.). Для поддержки нескольких платформ вы можете использовать #ifdef или иметь отдельный каталог include для каждой платформы (include_x86, include_x86_64, include_sparc). В последнем случае у вас будет отдельная конфигурация сборки для каждой платформы, которая имеет право включать каталог в свой путь включения. Второй способ предпочтительнее, по словам Стивена Дьюхерста "The С++ Gotchas".

В стороне, если вы планируете передавать двоичные данные между различными платформами, вам также нужно беспокоиться о порядке байтов.

Ответ 3

Часть стандарта C99 была заголовочным файлом stdint.h для предоставления такого рода информации. Например, он определяет тип, называемый uint32_t. К сожалению, многие компиляторы не поддерживают stdint.h. Лучшая кросс-платформенная реализация, которую я видел в stdint.h, находится здесь: http://www.azillionmonkeys.com/qed/pstdint.h. Вы можете просто включить это в свой проект.

Если вы используете boost, я считаю, что он также обеспечивает нечто эквивалентное заголовку stdint.

Ответ 4

Определите тип (например, int32) в файле заголовка. Для каждой платформы используйте другой #ifdef и убедитесь, что in32 является 32-битным целым числом. Всюду в вашем коде используйте int32 и убедитесь, что при компиляции на разных платформах вы используете правильное определение

Ответ 5

Две вещи:

Во-первых, есть файл заголовка limit.h, который дает много полезной платформы конкретная информация. Например, он даст значения max и min для типа int. Из этого вы можете определить, насколько велик тип int.

Вы также можете использовать оператор sizeof во время выполнения для этих целей.

Надеюсь, это поможет.,.

К

Ответ 6

Существует заголовок stdint.h, определенный стандартом C99 и (я думаю), какой-то вариант ISO С++. Это определяет хорошие типы, такие как int16_t, uint64_t и т.д., Которые гарантированно имеют определенный размер и представление. К сожалению, его доступность не совсем стандартная (Microsoft, в частности, была ногами) здесь.

Простым ответом является тот, который работает на каждой 32-битной архитектуре, базирующейся на байтах. Я знаю:

  • Все переменные char равны 1 байт
  • Все короткие переменные составляют 2 байта
  • Все переменные int 4 байт
  • НЕ используйте "длинный", который имеет неопределенный размер.
  • Все известные компиляторы с поддержкой 64-битной математики позволяют "длинный длинный" как собственный 64-разрядный тип.

Помните, что у некоторых 32-битных компиляторов вообще нет 64-битного типа, поэтому использование long long ограничит вас 64-разрядными системами и меньшим набором компиляторов (включая gcc и MSVC, так что большинство людей выиграли " не заботьтесь об этой проблеме).

Ответ 7

Если его имя начинается с двух символов подчеркивания (__), тип данных нестандартен.

__ int8 (без знака __int8)

__ int16 (без знака __int16)

__ int32 (без знака __int32)

__ int64 (без знака __int64)

Попробуйте использовать boost/cstdint.hpp