здравствуйте. мне необходимо каким-либо образом добиться независимости размера типа данных int от архитектуры/ОСи, на которых моя программа будет запущена. что-то типа: Код (Text): typedef int int_t; и везде ниже в своей проге юзать int_t. это все понятно, но это не исключает возможности того, что на разных архитектурах/под разными ОСями Код (Text): std::numeric_limits<int_t>::max(); будет разным. как мне это однозначно разрулить? спасибо за помощь.
у меня в проге используется STL, и, собссно, int, float типы данных, и куча моих классов. я так понимаю, мне надо задать директивы для std::size_t, int и float? или не только, и помимо них нужно будет также задать директивы для unsigned char, long, signed int, etc etc ? cложно пояснить... ну вот если представить что у меня есть 3d-engine, или что-то в этом роде. и мне надо чтобы его внутренние типы данных для оперирования координатами типов были жестко определены в рамках int и float типов данных. с указанными максимальными и минимальными пределами, и размером самих типов. в таком случае надо дефайнить только int и float, или же и все остальные простые типы данных??
varnie На самом деле требования к размеру типов данных в правильной программе встречаются очень редко. Это ситуации, когда программа должна общаться со своими же компиляциями под другие платформы через какую-то внешнюю подсистему. Например - общение по сети, или сохранение на винт с последующим чтением. При этом пакеты данных для общения через внешнюю подсистему лучше всего локализовать, используя типы данных, говорящих о своем размере в своем названии, а внутри программы использовать привычные типы. Вот что тебе нужно (псевдокод): #if defined WIN32 typedef char int8 // или byte typedef int int32 // или dword #elif defined WIN64 typedef char int8 // или byte typedef short int int32 // или dword #endif Эти имена явно дают понять, что тебя в первую очередь интересует размер типа (а значит речь идет об обмене данными через внешнюю подсистему).
Не совсем понял, но вроде у msvc есть такие типы: __int8 - 1 byte __int16 - 2 byte __int32 - 4 byte __int64 - 8 byte хмм... GCC, тоже поддерживает их.
typedef signed char Int8; typedef short Int16; typedef int Int32; typedef long long Int64; static_assert( CHAR_BITS == 8 ); static_assert( sizeof( Int8 ) == 1 ); static_assert( sizeof( Int16 ) == 2 ); static_assert( sizeof( Int32 ) == 4 ); static_assert( sizeof( Int64 ) == 8 ); Можешь ещё посмотреть, как сделано в zlib. Там с помощью limit.h и директив препроцессора выбирается подходящий тип. Примерно так (сама идея): #if INT_MAX = 0x7FFFFFFF typedef int Int32; #elif SHRT_MAX = 0x7FFFFFFF typedef short Int32; #endif
Arthur То, что они эксеншены. Все что не стандартно - УГ. Нет никакой гарантии что они останутся в новой версии компилятора.
_DEN_ Ну что-ж, готовится новый стандарт Си++, посмотрим чего они там за стандартизируют. Хотя я вот заметил что эти 4 экстеншена появились в компиляторе стандарта ISO C99. Ну вообщем stdint, вроде справляется с этой задачей