объявить независимый от архитектуры/ОСи тип данных

Тема в разделе "LANGS.C", создана пользователем varnie, 21 июл 2008.

  1. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    здравствуйте.

    мне необходимо каким-либо образом добиться независимости размера типа данных int от архитектуры/ОСи, на которых моя программа будет запущена. что-то типа:
    Код (Text):
    1. typedef int int_t;
    и везде ниже в своей проге юзать int_t. это все понятно, но это не исключает возможности того, что на разных архитектурах/под разными ОСями
    Код (Text):
    1. std::numeric_limits<int_t>::max();
    будет разным.
    как мне это однозначно разрулить? спасибо за помощь.
     
  2. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    stdint.h?
     
  3. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    varnie

    Директивами прекомпиляции, и больше никак.
     
  4. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    у меня в проге используется STL, и, собссно, int, float типы данных, и куча моих классов.
    я так понимаю, мне надо задать директивы для std::size_t, int и float? или не только, и помимо них нужно будет также задать директивы для unsigned char, long, signed int, etc etc
    ?

    cложно пояснить... ну вот если представить что у меня есть 3d-engine, или что-то в этом роде. и мне надо чтобы его внутренние типы данных для оперирования координатами типов были жестко определены в рамках int и float типов данных. с указанными максимальными и минимальными пределами, и размером самих типов.

    в таком случае надо дефайнить только int и float, или же и все остальные простые типы данных??
     
  5. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    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

    Эти имена явно дают понять, что тебя в первую очередь интересует размер типа (а значит речь идет об обмене данными через внешнюю подсистему).
     
  6. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    _DEN_
    а это точно так? oO
    short он вроде и в африке short..
     
  7. Arthur

    Arthur New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2007
    Сообщения:
    494
    Не совсем понял, но вроде у msvc есть такие типы:
    __int8 - 1 byte
    __int16 - 2 byte
    __int32 - 4 byte
    __int64 - 8 byte

    хмм...
    GCC, тоже поддерживает их.
     
  8. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Nouzui

    Я же написал: Вот что тебе нужно (псевдокод):
     
  9. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Arthur

    Позволять экстеншенам торчать наружу - дурной тон. Лучше использовать typedef.
     
  10. Arthur

    Arthur New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2007
    Сообщения:
    494
    _DEN_
    А что в экстеншенах плохого?

    Только не в C/C++ :)
     
  11. Maratyszcza

    Maratyszcza New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2006
    Сообщения:
    32
    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
     
  12. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Arthur

    То, что они эксеншены. Все что не стандартно - УГ. Нет никакой гарантии что они останутся в новой версии компилятора.
     
  13. Arthur

    Arthur New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2007
    Сообщения:
    494
    _DEN_

    Ну что-ж, готовится новый стандарт Си++, посмотрим чего они там за стандартизируют. Хотя я вот заметил что эти 4 экстеншена появились в компиляторе стандарта ISO C99.

    Ну вообщем stdint, вроде справляется с этой задачей :)
     
  14. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Arthur

    Ну он, вобщем-то, уже почти готов :)