为什么 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
而不是 float
或 double
,并且可以通过定义或取消定义该宏来切换所有实例。
还有其他类似的处理 width of integer types, different character sets 和其他平台相关的场景。
通过定义自己的类型,他们可以放心地相信这些类型的大小始终相同。
类型可能因平台和编译器而异。
尽管 STL 确实提供了 <cstdint>
一些开发人员更喜欢他们自己的定义,因为他们不想使用 STL。
大多数情况下,您可以假设 int 的大小为 32 位,但它可以改变,这就是一些开发人员更喜欢定义自己的可靠类型的地方,以防它可能不是。
过去这样做的原因是可移植性。 C 和 C++ 不对 int
、long
和 short
的大小做出具体保证,而库设计者通常需要它。
一个常见的解决方案是为数据类型定义自己的别名,并根据特定平台更改定义,确保使用适当大小的类型。
此问题起源于 C,并已通过引入 stdint.h
header 文件(在 C++ 中重命名为 cstdint
)得到解决。包含此 header 可让您声明类型 int32_t
、int16_t
等。但是,在引入 stdint.h
之前开发的库和需要在缺少此 [的平台上编译的库=24=] 正在使用旧的解决方法。
我最近开始使用 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
而不是 float
或 double
,并且可以通过定义或取消定义该宏来切换所有实例。
还有其他类似的处理 width of integer types, different character sets 和其他平台相关的场景。
通过定义自己的类型,他们可以放心地相信这些类型的大小始终相同。
类型可能因平台和编译器而异。
尽管 STL 确实提供了 <cstdint>
一些开发人员更喜欢他们自己的定义,因为他们不想使用 STL。
大多数情况下,您可以假设 int 的大小为 32 位,但它可以改变,这就是一些开发人员更喜欢定义自己的可靠类型的地方,以防它可能不是。
过去这样做的原因是可移植性。 C 和 C++ 不对 int
、long
和 short
的大小做出具体保证,而库设计者通常需要它。
一个常见的解决方案是为数据类型定义自己的别名,并根据特定平台更改定义,确保使用适当大小的类型。
此问题起源于 C,并已通过引入 stdint.h
header 文件(在 C++ 中重命名为 cstdint
)得到解决。包含此 header 可让您声明类型 int32_t
、int16_t
等。但是,在引入 stdint.h
之前开发的库和需要在缺少此 [的平台上编译的库=24=] 正在使用旧的解决方法。