强制类型为特定大小
Forcing types to a specific size
我一直在学习C++,我不太满意的一件事是数据类型大小不一致。 根据什么系统,在 int 上部署的东西可能是 16 位或 32 位等。
所以我认为使用定义为特定大小的数据类型(如字节、单词等)制作自己的头文件可能是个好主意,并将在任何平台上保持该大小。
两个问题。 首先,这是一个好主意吗? 还是会产生我不知道的其他问题? 其次,如何将类型定义为 8 位? 我不能只说 #define 字节字符,因为字符会因平台而异。
幸运的是,其他人也注意到了同样的问题。在 C99 和 C++11 中(因此将编译器设置为与这两种模式之一兼容,编译器设置中应该有一个开关),他们添加了标头 stdint.h(用于 C)和 cstdint(用于C++)。如果#include <cstdint>
,则会得到类型 int8_t、int16_t、int32_t、int64_t,对于无符号版本,它们以 u 为前缀。如果您的平台支持这些类型,则它们将与其他几种类型一起在标头中定义。
如果您的编译器尚不支持该标准(或者由于您无法控制的原因被迫保留在 C++03),那么还有 Boost。
但是,仅当您完全关心类型的大小时,才应使用它。 在大多数情况下,int
和unsigned
适用于一次性变量。 size_t
应该用于索引std::vector
等。
首先,你需要弄清楚你是否真的关心东西的大小。 如果您使用 int 来计算文件中的行数,您真的关心它是 32 位还是 64 位吗? 如果您正在使用打包的二进制数据,则需要 BYTE、WORD 等,但通常不是出于任何其他原因。 因此,您可能会担心一些无关紧要的事情。
更好的是,使用stdint.h中已经定义的东西。有关更多详细信息,请参阅此处。 类似的问题在这里。
例:int32_t始终为 32 位。
许多库都有自己的 .h 和大量的 typedef 来具有恒定大小的类型。这在制作可移植代码时很有用,并且避免依赖当前正在使用的平台的标头。
如果您只想确保内置数据类型具有最小大小,则可以在标头中使用 std::numeric_limits 进行检查。
std::numeric_limits<int>::digits
例如,将为您提供不带符号位的整数位数。和
std::numeric_limits<int>::max()
会给你最大值。
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 防止主数据类型C++的隐式转换
- 大量序列中核苷酸类型的快速计数
- 如何从C++中的依赖类型中获得它所依赖的类型
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如何获取std::result_of函数的返回类型
- 从父命名空间重载类型
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 访问者访问变体并返回不同类型时出错
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 模板元程序查找相似的连续类型名称
- 是否可以从int转换为enum类类型
- 构造函数正在调用一个使用当前类类型的函数
- 我应该使用什么来代替void作为变体中的替代类型之一
- 类中的字符串不命名类型