如果您想使用Qt,则必须包含quint8
,quint16
等等。
如果您想使用 GLib ,则必须欢迎guint8
,guint16
等等。
在Linux上有u32
,s16
等等。
uC / OS 定义SINT32
,UINT16
等等。
如果你必须使用这些东西的某些组合,你最好做好准备。因为在您的计算机上u32
将typedef
超过long
而quint32
将typedef
超过int
且编译器将抱怨
为什么每个人都这样做,如果有<stdint.h>
?这是图书馆的某种传统吗?
答案 0 :(得分:78)
stdint.h
并不存在。所以每个库都有自己的typedef
s。
答案 1 :(得分:40)
对于较旧的库,这是必需的,因为有问题的标题(stdint.h
)不存在。
但是,仍然存在一个问题:标准中的那些类型(uint64_t
和其他类型)是一个可选功能。因此,一个符合要求的实现可能不会附带它们 - 因此强制库现在仍然包含它们。
答案 2 :(得分:13)
stdint.h
自1999年以来已经标准化。许多应用程序更有可能定义(实际上是别名)类型以保持与底层机器架构的部分独立性。
它们使开发人员相信,他们的应用程序中使用的类型与其可能与语言标准或编译器实现不匹配的项目特定的行为假设相匹配。
这种做法反映在面向对象的Façade设计模式中,并且被开发人员滥用,并且总是为所有导入的库编写包装类。
当编译器的标准要低得多,并且机器架构可能从16位,18-bit到36-bit字长大型机不等时,这更多的是考虑因素。在融合32位ARM嵌入式系统的世界中,这种做法现在的相关性要低得多。对于具有odd存储器映射的低端微控制器,它仍然是一个问题。
答案 3 :(得分:4)
所以你有权将typedef char设置为int。
一个“编码恐怖”提到一个公司标题有一个程序员想要一个布尔值的点,而一个char是该作业的逻辑原生类型,所以写了typedef bool char
。然后,有人发现一个整数是最合乎逻辑的选择,并写了typedef bool int
。结果,在Unicode之前的年龄,实际上是typedef char int
。
我认为相当多的前瞻性,前瞻性兼容性。