Разница между UINT32_C и uint32_t

Насколько я знаю, суффикс t в uint32_t обозначает имя t ype, но мне интересно узнать, что такое C в UINT32_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_t является именем типа unsigned long long int , то UINT64_C(0x123) может расширяться до целочисленной константы 0x123ULL .

Таким образом, возможно, что эта константа более чем на 32 бита на некоторых редких системах.

Но если вы находитесь в системе, где определено несколько типов дополнений 8 бит 2 (большинство современных систем), а uint32_t существует, то это создает 32-битную константу.

Все они определены в stdint.h и были частью стандарта C с C99.

UINT32_C – это макрос для записи константы типа 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 – это тип, определенный как C99 в stdint.h.

Это макрос, добавляющий суффикс, создающий литерал, например #define UINT32_C(c) c##UL