为什么每个人都会在标准C类型上输入类型?

Amo*_*mum 103 c c++ stdint

如果你想使用Qt,你必须拥抱quint8,quint16等等.

如果你想使用GLib,你必须欢迎guint8,guint16等等.

Linux上有u32,s16等等.

uC/OS定义SINT32,UINT16等等.

如果你必须使用这些东西的某些组合,你最好为困难做好准备.因为在你的机器上u32将会typedef结束long并且quint32typedef结束int并且编译器会抱怨.

为什么每个人都这样做,如果有的话<stdint.h>?这是图书馆的某种传统吗?

Edw*_*rak 80

stdint.h在开发这些库时,它们并不存在.所以每个图书馆都有自己typedef的版本.

  • @Amomum"为什么Glib(在Linux上开发)没有使用Linux typedef?" 虽然glib的"home base"肯定是Linux,但它确实是设计一个可移植的库.定义自己的类型可确保可移植性:只需要将与库类型匹配的小标头调整到适当的目标平台类型. (25认同)
  • @ andy256"GLib"不是"glibc"的缩写.它是一个从gtk分支出来的库.它不比Linux老. (5认同)
  • 好吧,我认为缺少stdint.h是一个很好的理由,但为什么即使今天这些typedef都是int,long等等而不是stdint类型?这将使它们至少可以互换 (4认同)
  • @Amomum*为什么Glib(在Linux上开发)......*不,它不是.Glib是在Linux内核之前创建的*way*. (3认同)
  • @ andy256:glib是1998,linux是1991. IOW,GLib创建方式_after_ Linux. (2认同)

Ven*_*Ven 40

对于较旧的库,这是必需的,因为问题(stdint.h)中的标题不存在.

但是,仍然存在一个问题:这些类型(uint64_t和其他类型)是标准中的可选功能.因此,一个符合要求的实现可能不会附带它们 - 因此强制库现在仍然包含它们.

  • @Amomum如果实现具有满足要求的类型,则typedef*是必需的:"但是,如果实现提供宽度为8,16,32或64位的整数类型,则不填充位,以及(对于签名类型)它具有二进制补码表示,它应定义相应的typedef名称." (引自N1570,7.20.1.1"精确宽度整数类型")因此,如果标准库没有它们,那么第三方库也不可能. (23认同)
  • 当然,它们是可选的原因是你不能保证*是*整数类型,具有完全相同的位数.C仍然支持具有相当奇怪的整数大小的体系结构. (16认同)
  • `uintN_t`类型是可选的,但`uint_leastN_t`和`uint_fastN_t`类型不是. (14认同)
  • @Kusalananda:可悲的是,这些用途有限. (7认同)
  • @LightnessRacesinOrbit:它们的用途有限吗?我必须承认,除了硬件接口之外,我不明白为什么你需要一个确切的位数而不是最小值来确保所有的值都适合. (5认同)
  • @celtschk无论何时通过网络进行通话,都需要精确的长度值,因为您无法对远程端的类型做出假设. (2认同)
  • 如果一个实现没有`uint64_t`,那肯定是因为它没有任何无符号的64位类型,所以创建自己的typedef也不起作用。 (2认同)
  • @KyleStrand:FORTRAN因其能够让编译器接受循环并重新排列以获得最佳效率而闻名,但这种能力要求编译器知道可以访问数据的所有方式.C以其能够让程序员以多种不同方式自由访问存储的能力而闻名.编译器通过推定声明由于标准并未强制要求编译器识别C实现历史上允许的所有方式来执行过去保留给FORTRAN编译器的各种优化变得越来越时髦...... (2认同)

Pek*_*kka 13

stdint.h 自1999年以来已经标准化.许多应用程序更有可能定义(有效别名)类型以保持与底层机器架构的部分独立性.

它们使开发人员确信其应用程序中使用的类型与其可能与语言标准或编译器实现不匹配的行为的项目特定假设相匹配.

这种做法反映在面向对象的Façade设计模式中,并且被开发人员滥用,并且总是为所有导入的库编写包装类.

当编译器的标准要低得多,并且机器架构可能从16位,18位36位字长的大型机不等时,这更多是一个考虑因素.在融合32位ARM嵌入式系统的世界中,这种做法现在的相关性要低得多.对于具有奇数存储器映射的低端微控制器,它仍然是一个问题.

  • @supercat-值得向C委员会提交勘误表...因为*愚蠢地* (2认同)