簡體   English   中英

UINT32_C和uint32_t之間的區別

[英]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最小寬度整數常量的宏

  1. INT N _C( 將擴展為對應於int_least N _t類型的整數常量表達式。 UINT N _C( 將擴展為對應於類型uint_least N _t的整數常量表達式。 例如,如果uint_least64_tunsigned 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

ULunsigned 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM