C++ uint32、int16、uint8。。为什么这些常用的数据类型没有被纳入标准
多年来,在涉及C/C++的多个组织和各种项目中,我发现通过定义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
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认为它确实回答了问题,那么我有谁不同意?我不再提那件事了。这是一篇有趣的帖子。