Ответ 1
Я нашел этот заголовок особенно полезным: BOOST cstdint
Обычно лучше, чем изобретать собственное колесо (которое требует обслуживания и тестирования).
В отличие от Java или С#, примитивные типы данных на С++ могут отличаться по размеру в зависимости от платформы. Например, int
не гарантируется как 32-разрядное целое число.
Различные среды компилятора для этой цели определяют типы данных, такие как uint32
или dword
, но, похоже, нет стандартного файла include для типов данных фиксированного размера.
Каков рекомендуемый метод для достижения максимальной переносимости?
Я нашел этот заголовок особенно полезным: BOOST cstdint
Обычно лучше, чем изобретать собственное колесо (которое требует обслуживания и тестирования).
Создайте файл заголовка с именем types.h и определите все необходимые вам примитивные типы фиксированного размера (int32, uint32, uint8 и т.д.). Для поддержки нескольких платформ вы можете использовать #ifdef
или иметь отдельный каталог include для каждой платформы (include_x86, include_x86_64, include_sparc). В последнем случае у вас будет отдельная конфигурация сборки для каждой платформы, которая имеет право включать каталог в свой путь включения. Второй способ предпочтительнее, по словам Стивена Дьюхерста "The С++ Gotchas".
В стороне, если вы планируете передавать двоичные данные между различными платформами, вам также нужно беспокоиться о порядке байтов.
Часть стандарта C99 была заголовочным файлом stdint.h для предоставления такого рода информации. Например, он определяет тип, называемый uint32_t. К сожалению, многие компиляторы не поддерживают stdint.h. Лучшая кросс-платформенная реализация, которую я видел в stdint.h, находится здесь: http://www.azillionmonkeys.com/qed/pstdint.h. Вы можете просто включить это в свой проект.
Если вы используете boost, я считаю, что он также обеспечивает нечто эквивалентное заголовку stdint.
Определите тип (например, int32) в файле заголовка. Для каждой платформы используйте другой #ifdef и убедитесь, что in32 является 32-битным целым числом. Всюду в вашем коде используйте int32 и убедитесь, что при компиляции на разных платформах вы используете правильное определение
Две вещи:
Во-первых, есть файл заголовка limit.h, который дает много полезной платформы конкретная информация. Например, он даст значения max и min для типа int. Из этого вы можете определить, насколько велик тип int.
Вы также можете использовать оператор sizeof во время выполнения для этих целей.
Надеюсь, это поможет.,.
К
Существует заголовок stdint.h, определенный стандартом C99 и (я думаю), какой-то вариант ISO С++. Это определяет хорошие типы, такие как int16_t, uint64_t и т.д., Которые гарантированно имеют определенный размер и представление. К сожалению, его доступность не совсем стандартная (Microsoft, в частности, была ногами) здесь.
Простым ответом является тот, который работает на каждой 32-битной архитектуре, базирующейся на байтах. Я знаю:
Помните, что у некоторых 32-битных компиляторов вообще нет 64-битного типа, поэтому использование long long ограничит вас 64-разрядными системами и меньшим набором компиляторов (включая gcc и MSVC, так что большинство людей выиграли " не заботьтесь об этой проблеме).
Если его имя начинается с двух символов подчеркивания (__), тип данных нестандартен.
__ int8 (без знака __int8)
__ int16 (без знака __int16)
__ int32 (без знака __int32)
__ int64 (без знака __int64)
Попробуйте использовать boost/cstdint.hpp