据我所知,uint32_t中的后缀t表示t ype名称,但我想知道UINT32_C中的C是什么,有什么区别?
use*_*733 13
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.
Run Code Online (Sandbox Code Playgroud)
7.20.4.1最小宽度整数常量的宏
- 宏INT N _C(值)将扩展为对应于int_least N _t类型的整数常量表达式.宏UINT N _C(值)将扩展为对应于类型uint_least N _t的整数常量表达式.例如,if
uint_least64_t是类型的名称unsigned long long int,则UINT64_C(0x123)可以扩展为整数常量0x123ULL.
因此,在某些稀有系统上,该常数可能超过32位.
但是如果你所在的系统中定义了多个8位2的补码类型(大多数现代系统)并且uint32_t存在,则会产生32位常数.
它们都是在stdint.hC99 中定义的,并且已经成为C标准的一部分.
小智 8
UINT32_C是一个用于编写类型常量的宏uint_least32_t.这种常数适用于例如初始化uint32_t变量.我在avr-libc中找到了以下定义(这是针对AVR目标,仅作为示例):
#define UINT32_C(value) __CONCAT(value, UL)
Run Code Online (Sandbox Code Playgroud)
所以,当你写作
UINT32_C(25)
Run Code Online (Sandbox Code Playgroud)
它扩展到了
25UL
Run Code Online (Sandbox Code Playgroud)
UL是unsigned long整数常量的后缀.因为是没有标准的后缀宏是非常有用的uint32_t,所以你可以使用它,而不知道你的目标,uint32_t是一个typedef如对unsigned long.对于其他目标,它将以不同的方式定义.