2016-02-15 21 views
1

我现在正在浏览“Arduino \ hardware \ tools \ avr \ avr \ include”文件夹中的avr库。在stdint.h文件中,有一段代码:avr-gcc库中typedef int16_t int_fast16_t的用途

typedef unsigned int uint16_t __attribute__ ((__mode__ (__HI__))); 
typedef signed int int32_t __attribute__ ((__mode__ (__SI__))); 

typedef uint16_t uint_fast16_t; 

/** \ingroup avr_stdint 
    fastest signed int with at least 32 bits. */ 

typedef int32_t int_fast32_t; 

所以基本上int32_tint_fast32_tsigned int __attribute__ ((__mode__ (__SI__)))是一样的。有人可以证实吗?

如果是,为什么这样做?为什么不只是使用int32_t?

+1

“的代码和平”通常情况下,我不对语言错误大惊小怪,但这实际上很有趣。这是“一块”,顺便说一句。没有冒犯的意思。 :-) – Downvoter

+1

如果你问为什么'stdint.h'声明'int_(least | fast)N_t'类型以及你期望的'intN_t'类型,答案是语言标准(C99)需要最少/快速的类型,因为委员会认为它们会有用。事实证明,他们错了,但向后兼容性意味着即使几乎没有人使用它们,标题也必须继续声明它们。如果你问别的东西,我不明白你在问什么,请澄清。 – zwol

+0

@cad。谢谢:),只是机械标记 – Qeeet

回答

2

我明白这个问题是“为什么stdint.h声明类型名称为int_leastN_tint_fastN_t以及我希望它声明的intN_t?”

简单的答案是C标准(自1999年修订以来)要求stdint.h来声明这些类型,因为委员会认为它们会有用。碰巧,他们错了;几乎没有人想要什么stdint.h确切的宽度类型。但是一旦它被包含在C标准中,任何事情都会被删除,这是非常非常罕见的,因为这会破坏使用它们的程序,即。因此stdint.h可能会继续永久声明这些类型。

(我可以在相当长去约为什么非精确宽度类型小于用C是有用的,但你可能不关心。)

+0

同意“需要stdint.h中的任何内容,但是需要精确宽度的类型”。我思考一个未来的C模型[主要使用固定宽度类型](http://stackoverflow.com/q/30942107/2410359),并将int/unsigned(自动升级的排名)修复为32位,即使在机器宽度增长到128. – chux

+0

@chux:没有问题上限'int'等,但不修复它们到32位。 16位很好。一般来说,制作像“快速”等标准类型会更好(哎呀,它们已经是......)。 – Olaf

+0

这些类型不常用的原因可能只是懒惰的程序员(如我)和冗余,因为标准类型实际上是相同的。 – Olaf

2

实际答案取决于您的实施。 typedef的实际意义在于让程序员不得不关心微观优化,比如选择一种整数类型而不是另一种整数类型,这仅仅是因为性能有所提升,仍然可以编写独立于平台的代码。 signed int __attribute__ ((__mode__(__SI__)))可能是一个平台上表现最好的整数类型,但只要决定支持另一个平台,就会有数千种类型的数据需要更改。