«Uint32», «int16» и т.п .; они стандартны с ++? - PullRequest
29 голосов
/ 26 мая 2009

Я довольно новичок в c ++, но я знаком с основами. Я сталкивался с использованием "Uint32" (в различных заглавных буквах) и аналогичных типов данных при чтении чужого кода, но я не могу найти документацию, в которой упоминается их. Я понимаю, что "Uint32" является неподписанным int с 32 битами, но мой компилятор этого не делает. Я использую Visual C ++ Express, и он не распознает никакой формы из того, что я могу сказать.

Существуют ли некоторые компиляторы, которые читают эти типы данных по умолчанию, или эти программисты объявили их как классы или #define константы?

Я вижу смысл в том, чтобы использовать их, чтобы точно знать, как долго будет длиться целое число, так как обычное объявление, похоже, зависит от системы. Есть ли другие плюсы или минусы, использующие их?

Ответы [ 6 ]

19 голосов
/ 26 мая 2009

Платформы Unix определяют эти типы в stdint.h , это предпочтительный метод обеспечения размера типов при написании переносимого кода.

Платформы Microsoft не определяют этот заголовок, что является проблемой при переходе между платформами. Если вы еще не используете Boost Integer Library , я рекомендую установить portable stdint.h этого заголовка для использования на платформах Microsoft.

Обновление: Visual Studio 2010 и более поздние версии определяют этот заголовок.

13 голосов
/ 26 мая 2009

Заголовочный файл C99 stdint.h определяет определения типа этой природы вида uint32_t. Насколько я знаю, стандартный C ++ не предоставляет версию этого cstdint с символами в пространстве имен std, но некоторые компиляторы могут, и вы, как правило, сможете в любом случае включить заголовок C99 из кода C ++. Следующая версия C ++ будет содержать заголовок cstdint.

Вы часто будете видеть код от других людей, которые используют нестандартные формы этой темы, такие как Uint32_t или Uint32 или uint32 и т. Д. Обычно они просто предоставляют один заголовок, который определяет эти типы в проекте. , Вероятно, этот код был первоначально разработан давно, и они никогда не удосужились заменить определения, когда компиляторы C99 стали распространенными.

12 голосов
/ 26 мая 2009

Visual c ++ не поддерживает целочисленные типы фиксированной ширины, поскольку он не поддерживает C99. Ознакомьтесь с ответами на мой вопрос на эту тему , чтобы узнать, какие у вас есть варианты для их использования.

3 голосов
/ 26 мая 2009

Основная причина их использования заключается в том, что вам не нужно беспокоиться о возможных проблемах, возникающих при переключении между 64-битной и 32-битной ОС.

Кроме того, если вы подключаетесь к любому устаревшему коду, который вы разрабатывали, предназначался для 32-битного или даже 16-битного кода, это также позволяет избежать потенциальных проблем.

1 голос
/ 26 мая 2009

uint32 и др. определяются макросами. Они решают историческую проблему переносимости, заключающуюся в том, что на разных платформах было мало гарантий (тогда как там было больше вариантов платформ, чем сейчас), сколько битов вы получите, когда попросите int или short. (Одна теперь несуществующая компиляция C для Mac предоставила 8-битные шорты!).

1 голос
/ 26 мая 2009

Попробуйте UINT32 для Microsoft.

Верхний регистр дает понять, что это определено как макрос. Если вы попытаетесь скомпилировать с использованием другого компилятора, который еще не содержит макрос, вы можете определить его самостоятельно, и ваш код не должен изменяться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...