为什么*_leastN_t和*_fastN_t类型是必需的,而不是可选的
Why are the *_leastN_t and *_fastN_t types required, not optional?
我们都知道,C99的stdint.h
中定义的精确宽度整数typedef是可选的,只有当体系结构具有这些宽度、符号等的基元类型时才能定义。
然而,我刚刚意识到[u]int_(fast|least)N_t
不是可选的,而是必需的。参见ISO/IEC 9899:9999,第7.18.1节:
[7.18.2]3需要以下类型:
int_least8_t int_least16_t int_least32_t int_least64_t uint_least8_t uint_least16_t uint_least32_t uint_least64_t
[7.18.13]3需要以下类型:
int_fast8_t int_fast16_t int_fast32_t int_fast64_t uint_fast8_t uint_fast16_t uint_fast32_t uint_fast64_t
因此,如前所述,所有能够提供符合标准的C或C++编译器的体系结构——包括独立的体系结构,因为其中需要stdint.h
——都必须能够提供至少64位的基元类型!
考虑到标准在许多其他实现细节上的回旋余地,这对我来说似乎很奇怪。这尤其是因为显然,我们自1999年以来就一直在执行它,几年后64位计算甚至在桌面上成为主流。更不用说在许多情况下仍然是当前的嵌入式体系结构中落后于此。
要求所有实现都具有至少64位的基元类型的基本原理是什么?而且,由于这肯定会对实践中的实施者产生严重影响,他们对此有何反应/处理?
(…或者我在阅读中错过了什么,也总是一个答案)
所有C和C++实现都必须提供至少64位的类型,这是正确的,但这不仅仅是uint_least64_t
和int_least64_t
的强制要求。unsigned long long int
和long long int
的最小范围也需要64位。
为什么标准委员会认为要求64位类型是值得的?很难说,但可能是因为大多数体系结构都有一个可用的体系结构,而那些没有的体系结构可以通过库函数实现它(如果不使用库函数,就不会链接)。
相关文章:
- 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作为变体中的替代类型之一
- 类中的字符串不命名类型