2015-06-12 2 views
5

В последнее время я начал использовать библиотеку OpenCL, и я заметил, что они используют собственные целые типы, такие как cl_int и cl_uint вместо int и unsigned int.Почему библиотеки C++ часто определяют свои собственные примитивные типы?

Почему? Почему они не используют типы по умолчанию на языке? Это хорошая практика или есть практические причины для этого (то есть более читаемый код)?

+1

В основном для перекрестного соответствия x64/x86 или для определения конкретного состояния. – Bastien

+0

https://en.wikipedia.org/wiki/Not_invented_here –

ответ

8

Причина, по которой это было сделано в прошлом, является переносимостью. C и C++ не дают конкретных гарантий размера int, long и short, в то время как разработчики библиотек часто требуют этого.

Общим решением является определение их собственных псевдонимов для типов данных и изменение определений на основе конкретной платформы, следя за тем, чтобы тип соответствующего размера использовался.

Эта проблема возникла из C и была рассмотрена путем введения файла заголовка stdint.h (переименована в cstdint в C++). Включение этого заголовка позволяет объявлять типы int32_t, int16_t и т. Д. Однако библиотеки, разработанные до введения stdint.h, и библиотеки, необходимые для компиляции на платформах, не имеющих этого заголовка, используют старое обходное решение.

+0

Намного понятнее, спасибо. Не могли бы вы сослаться на какой-нибудь сайт для конкретного примера, как бы вы определили свой собственный целочисленный тип, который, скажем, без знака и 16 бит? – Addy

+1

@Addy Обычно это делается с условной компиляцией '# ifdef' и' typedef 'в одном из заголовков. Для OpenCL это [cl_platform.h] (https://www.khronos.org/registry/cl/api/1.1/cl_platform.h). Найдите файл для 'cl_uint', чтобы узнать, как он определяется на платформе. – dasblinkenlight

3

Часто это разные конфигурации могут быть установлены и распространены во всем коде.

Например, я знаю, что Bullet 3 определяет btScalar, который (помимо всего прочего) является в основном:

#if defined(BT_USE_DOUBLE_PRECISION) 
typedef double btScalar; 
#else 
typedef float btScalar; 
#endif 

Так в коде, вы можете использовать btScalar вместо float или double, и все случаи, которые могут быть переключается путем определения или неопределения этого макроса.

Существуют и другие аналоги этого, которые обрабатывают width of integer types, different character sets и другие сценарии, зависящие от платформы.

3

Определяя их собственные типы, они могут надежно полагаться на знание того, что эти типы всегда будут одного размера.

Типы могут варьироваться от платформы к платформе и компилятора к компилятору. Хотя STL предоставляет <cstdint>, некоторые разработчики предпочитают свои собственные определения, потому что они не хотят использовать STL.

В большинстве случаев вы можете предположить, что int будет иметь размер 32 бита, но он может измениться, и именно здесь некоторые разработчики предпочитают определять свои собственные надежные типы по вероятности того, что это может быть не так.

Смежные вопросы