为什么 C++ 库经常定义自己的原始类型?

Why do c++ libraries often define their own primitive types?

我最近开始使用 OpenCL 库,我注意到它们使用自己的整数类型,例如 cl_int 和 cl_uint 而不是 int 和 unsigned int。

这是为什么?他们为什么不使用语言中默认的类型?这是一个好的做法还是有实际原因(即更易读的代码)?

通常情况下可以设置不同的配置并在整个代码中传播。

例如,我知道 Bullet 3 defines btScalar,这(除其他事项外)基本上是:

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

因此在整个代码中您可以使用 btScalar 而不是 floatdouble,并且可以通过定义或取消定义该宏来切换所有实例。

还有其他类似的处理 width of integer types, different character sets 和其他平台相关的场景。

通过定义自己的类型,他们可以放心地相信这些类型的大小始终相同。

类型可能因平台和编译器而异。 尽管 STL 确实提供了 <cstdint> 一些开发人员更喜欢他们自己的定义,因为他们不想使用 STL。

大多数情况下,您可以假设 int 的大小为 32 位,但它可以改变,这就是一些开发人员更喜欢定义自己的可靠类型的地方,以防它可能不是。

过去这样做的原因是可移植性。 C 和 C++ 不对 intlongshort 的大小做出具体保证,而库设计者通常需要它。

一个常见的解决方案是为数据类型定义自己的别名,并根据特定平台更改定义,确保使用适当大小的类型。

此问题起源于 C,并已通过引入 stdint.h header 文件(在 C++ 中重命名为 cstdint)得到解决。包含此 header 可让您声明类型 int32_tint16_t 等。但是,在引入 stdint.h 之前开发的库和需要在缺少此 [的平台上编译的库=24=] 正在使用旧的解决方法。