我更像是一个系统管理员而不是一个程序员.但是,我花了大量时间在程序员的代码中徘徊,试图弄清楚出了什么问题.和一个令人不安的量是时间是花在处理问题时,程序员预期__u_ll_int32_t或什么(是的,我知道这不是真正的)的一个定义,但无论是预期的定义该类型文件的某处其他比它,或(这是更糟糕的,但幸运的是,很少见)预期该定义的语义不是它的东西.
据我了解C,它故意不作整数类型的宽度定义(并认为这是一件好事),而是为程序员提供了char
,short
,int
,long
,和long long
,在他们所有的符号和无符号的荣耀,与定义最小值该实施(希望)满足.此外,它提供了实现必须提供要告诉你像一个字符,最大的无符号长等优点的宽度然而第一件事任何不平凡的C++项目似乎做的事情程序员不同的宏被导入或发明另一组类型,它们明确地给出了8,16,32和64位整数.这意味着,作为系统管理员,我必须在编程需要一个地方的定义文件(也就是,毕竟是我的工作),但当时并不是所有的所有这些定义的语义是相同的(这轮已多次重新发明)并且我不知道在这里满足所有用户需求的非临时方式.(我有时会使用<bits/types_for_ralph.h>,我知道每次我都会让小狗哭泣.)
试图明确地定义数字的位宽(用一种特别不想这样做的语言)会让程序员感到头疼吗?为什么不知道定义的最小值和平台提供的MAX/MIN宏足以完成C程序员想要做的事情?你为什么要选择一种语言,它的主要优点是它可以在任意比特的平台上移植,然后自己输入特定的比特宽度?
dan*_*n04 11
当C或C++程序员(以下称为第二人称)选择整数变量的大小时,通常是在下列情况之一:
在这种情况下,您需要int_leastN_t
from 的语义<stdint.h>
.程序员在intN_t
这里使用精确宽度是很常见的,技术上他们不应该这样做; 然而,8/16/32/64位机器今天占据绝对优势,这种区别仅仅是学术性的.
您可以使用标准类型并依赖诸如" int
必须至少为16位"之类的约束,但缺点是整数类型没有标准的最大大小.如果int
你真的只需要16位,那么恰好是32位,那么你就不必要地增加了数据的大小.在许多情况下(见下文),这不是问题,但如果你有一个包含数百万个数字的数组,那么你会遇到很多页面错误.
这是int_fastN_t
类型<stdint.h>
.但是,通常只使用int
这里的内置函数,它在16/32位的日子里具有语义int_fast16_t
.它不是64位系统上的本机类型,但它通常足够好.
这对应于类型定义size_t
,ptrdiff_t
,intptr_t
等你有因为这里使用typedef 没有内置有保证为内存大小的类型.
fread
/ 序列化到文件的结构的一部分fwrite
,或者是从具有自己的固定宽度数据类型的非C语言(Java,COBOL等)调用的结构的一部分.在这些情况下,您确实需要精确宽度类型.
int
习惯了.通常,这种方法效果很好.
因此,总而言之,所有typedef <stdint.h>
都有自己的用例.但是,由于以下原因,内置类型的有用性受到限制:
至于为什么有这么多的固定宽度(冗余的typedef WORD
,DWORD
,__int64
,gint64
,FINT64
,等)和memsize个(INT_PTR
,LPARAM
,VPTRDIFF
等)整数类型,这主要是因为<stdint.h>
使用C的发展起步较晚,人们还在使用旧的编译不支持它,因此库需要定义自己的.C++有这么多字符串类的原因相同.