Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ uint32、int16、uint8。。为什么这些常用的数据类型没有被纳入标准_C++_C - Fatal编程技术网

C++ uint32、int16、uint8。。为什么这些常用的数据类型没有被纳入标准

C++ uint32、int16、uint8。。为什么这些常用的数据类型没有被纳入标准,c++,c,C++,C,多年来,在涉及C/C++的多个组织和各种项目中,我发现通过定义types.h的本地版本,已经解决了固定宽度整数的需求,该版本大致如下所示:- typedef signed char int8; typedef unsigned char uint8; typedef signed short int16; typedef unsigned short uint16; typedef signed long int32; type

多年来,在涉及C/C++的多个组织和各种项目中,我发现通过定义
types.h
的本地版本,已经解决了固定宽度整数的需求,该版本大致如下所示:-

typedef  signed char        int8;
typedef  unsigned char      uint8;
typedef  signed short       int16;
typedef  unsigned short     uint16;
typedef  signed long        int32;
typedef  unsigned long      uint32
typedef  signed long long   int64;
typedef  unsigned long long uint64;
为什么这些没有集成到C/C++标准中

我知道
C99
已经标准化了
uint32\u t
之类的产品。同样,微软也定义了自己的
UINT32
等但是这些仍然需要
typedef
s,因为 uintX行话在经验丰富的开发人员编写的旧代码和新代码中广泛使用

我也意识到,这不是标准C++,因为它们清楚地提到:-< /P> 因为它们是boost头文件,所以它们的名称与boost头文件一致 命名约定而不是C++标准库头命名 惯例

关于将
[u]intX
s纳入官方标准的利弊思考

编辑
这个问题已经产生了高质量的答案和意见。谢谢,他们信息丰富,很有帮助!!一些评论认为这个问题不够清楚:-
“您特别要求为标准中已有的typedef添加更多别名”-是的

@Pascal Cuoq的ans解决了标准中添加这些内容时的实际问题:-

不要等待名称
uint32
成为某个公司的正式名称 C++中的整数类型;这可能永远不会发生,正是因为 很多程序已经在用这个名字定义一个类型了


实际上它们是C++ 11标准的一部分,但是用<代码> < t >代码>后缀:

不偏离其他常见类型,并保持命名方案。如果有些标准类型以
\u t
结尾,而有些则不以
结尾,这将非常违反直觉

但其中一些是可选的,因为底层硬件可能不支持它们。因此,有一些类似于
int\u-least8\u t
,其大小至少为8位:

宽度至少为8位的最小有符号整数类型

这样的类型又可以保证可移植性

你不能/不应该把东西放在一个不可移植的标准上,这将禁止在特定平台上使用该语言


<强>除了上面的思想之外,还有多少代码断裂?,我从以前的C++标准委员会会议中看到的:当一个新的特性将被引入时,引用实现被执行,并且编译测试在现有代码上运行,以找出这个特性可能会中断多少代码。例如,当改变<代码> Audio/Cuth>关键字含义时,

< P>类型> DEXS,代码为< >代码> >后缀已经存在,作为90年代后期,可能更早的一个不同的官方标准的一部分,这就是为什么这些版本被纳入C和C++标准。
当标准typedef已经存在时,人们使用不同的typedef是他们的问题。在标准中复制整个typedef列表只会造成更大的混乱。

C99引入了标题
stdint.h
(7.18),C++11将其作为
导入

您可能会问,为什么其中的类型名称是
uint32\u t
,而不是
uint32
。简单:因为这样名称就会与现有代码冲突

POSIX为类型保留了
\t
后缀。(如果您想与当前和未来的POSIX系统兼容,就不应该对程序中的任何类型使用
\u t
。这是一个即使有经验的程序员也会犯的常见错误)。POSIX还使用其保留的名称空间以
uint32\t
格式安全地定义类型名称

C99选择了与POSIX相同的名称。从C委员会的角度来看,这些名称不太可能破坏现有程序(在发展C语言时,向后兼容性是一个非常重要的考虑因素)。后来,当它们出现在C++中时,在选择C++和C之间的兼容性比选择不同的名称更有价值。
< >不要等待名称<代码> UTIT32 < /Cord>成为C++中整数类型的正式名称;这可能永远不会发生,因为有太多的程序已经将类型定义为这个名称。

但是我们有
stdint.h
。这只是一种命名约定
\u t
通常用于类型。我看不到
uint32
u32
更常用,您特别要求为标准中已经存在的typedef添加更多别名。这不是很清楚,我可以推荐编辑吗?是的,我一直想要一个
int\u,它可以保存一个unicode字符
名称!严肃地说:你的
uintN\t
有什么问题?打字太多了?使用autocompletion获取编辑器。C99添加
(u)int*\t
,因为POSIX已经有
(u)int*\t
。您对POSIX为什么选择这些名称的解释是正确的。@hvd:这正是我想问的-可能是我没有正确地提出问题-请随意编辑it@hvd哦,真有趣!我写道,类型的
*\t
名称空间是由POSIX保留的,但从POSIX中删除了该名称空间,因为它不适合其他名称空间。我会再介绍一遍。tbh我不知道OP在问什么,所以如果我不回答它就足够公平了。@PascalCuoq如果OP认为它确实回答了问题,那么我有谁不同意?我不再提那件事了。这是一篇有趣的帖子。