UINT32_C和uint32_t之间的区别

据我所知, uint32_t中的后缀t表示名称,但我想知道UINT32_C中C什么 ,有什么区别?

UINT32_C是一个定义uint_least32_t类型的整数常量的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