[英]Difference between UINT32_C and uint32_t
據我所知, uint32_t中的后綴t表示t ype名稱,但我想知道UINT32_C中的C是什么 ,有什么區別?
UINT32_C
是一個宏,它定義了uint_least32_t
類型的整數常量。 例如:
UINT32_C(123) // Might expand to 123UL on system where uint_least32_t is unsigned long
// or just 123U, if uint_least32_t is unsigned int.
7.20.4.1最小寬度整數常量的宏
- 宏INT N _C( 值 )將擴展為對應於int_least N _t類型的整數常量表達式。 宏UINT N _C( 值 )將擴展為對應於類型uint_least N _t的整數常量表達式。 例如,如果
uint_least64_t
是unsigned long long int
類型的名稱,則UINT64_C(0x123)
可能會擴展為整數常量0x123ULL
。
因此,在某些稀有系統上,該常數可能超過32位。
但是如果你所在的系統中定義了多個8位2的補碼類型(大多數現代系統),並且存在uint32_t
,則會產生32位常數。
它們都在stdint.h
中定義,並且自C99以來一直是C標准的一部分。
UINT32_C
是一個用於寫入uint_least32_t
類型常量的uint_least32_t
。 這種常量適用於例如初始化uint32_t
變量。 我在avr-libc中找到了以下定義(這是針對AVR目標,僅作為示例):
#define UINT32_C(value) __CONCAT(value, UL)
所以,當你寫作
UINT32_C(25)
它擴展到了
25UL
UL
是unsigned long
整數常量的后綴。 該宏非常有用,因為uint32_t
沒有標准后綴,因此您可以在不知道目標的情況下使用它, uint32_t
是一個typedef
例如unsigned long
。 對於其他目標,它將以不同的方式定義。
這些常量的定義如下:
#define UINT32_C(value) (value##UL)
您只能將常量值作為宏參數,否則不會編譯。
UINT32_C(10); // compiles
uint32_t x = 10;
UINT32_C(x); // does not compile
不知道keil,但至少在Linux中UINT32_C是一個創建uint32_t文字的宏。
正如其他人所提到的,uint32_t是一個在stdint.h中定義為C99的類型。
它是附加后綴的宏,用於創建文字,例如#define UINT32_C(c) c##UL
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.