Вопрос

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

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

Это было полезно?

Решение

Я нашел этот заголовок особенно полезным:ПОВЫШЕНИЕ cstdint

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

Другие советы

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

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

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

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

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

Две вещи:

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

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

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

К

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

__int8 (беззнаковый __int8)

__int16 (беззнаковый __int16)

__int32 (беззнаковый __int32)

__int64 (беззнаковый __int64)

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

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

Простой ответ таков: он работает на любой 32- или 64-битной архитектуре с байтовой адресацией, о которой я знаю:

  • Все переменные типа char имеют размер 1 байт.
  • Все короткие переменные имеют размер 2 байта.
  • Все переменные int имеют размер 4 байта.
  • НЕ ИСПОЛЬЗУЙТЕ «длинный» элемент неопределенного размера.
  • Все известные компиляторы с поддержкой 64-битной математики допускают использование «long long» в качестве собственного 64-битного типа.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top