2016-02-15 58 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__)))可能是一個平臺上表現最好的整數類型,但只要決定支持另一個平臺,就會有數千種類型的數據需要更改。