UINT32_C和uint32_t之间的区别

Moh*_*efi 7 c c99 keil

据我所知,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最小宽度整数常量的宏

  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)

ULunsigned long整数常量的后缀.因为是没有标准的后缀宏是非常有用的uint32_t,所以你可以使用它,而不知道你的目标,uint32_t是一个typedef如对unsigned long.对于其他目标,它将以不同的方式定义.

  • @PeterJ - 绝对没有用武之地.当然你不会用它来初始化变量,但是如何将参数传递给`_Generic`选择所选择的函数呢?常数的类型会产生很大的影响. (2认同)