总的来说,我有点理解整数文字在宏中的工作方式。因此,如果我想在宏中将某些内容定义为 unsigned long
,我将生成以下代码:
#define CLOCK_FREQUENCY 16000000UL
这是我对整数文字的一般理解。
然而,我的目标是在我的宏中指定一个数字作为 uint32_t
。在尝试找到执行此操作的方法时,我还没有发现任何与 uint32_t
对应的整数文字。那么,有没有一种方法可以将数字实际指定为 uint32_t
或整数文字表示法不可用的其他类型(就此而言)?
最佳答案
How can I assign the type to a macro-defined number?
对于 uint32_t
, 使用类型转换以及 @dasblinkenlight 的回答
类型转换有陷阱。
当 unsigned
时,转换可以缩小常量如下是 16 位的。由于编译器假定程序员是正确的,因此强制转换可能不会生成有关此的警告。
// Becomes 9216 on a 16-bit `unsigned.
#define CLOCK_FREQUENCY ((unsigned) 16000000)
C 与 <stdint.h>
为最小宽度整数常量提供宏。我找到了 ((uint32_t)16000000)
最好
下面的结果是 uint_least32_t
, 通常与 uint32_t
相同.
UINT32_C(16000000)
当需要容纳常量的类型时,通常不使用强制转换。
#define CLOCK_FREQUENCY 16000000U
当需要特定类型时,转换是个好主意。
#define CLOCK_FREQUENCY ((uint32_t) 16000000U)
当需要的字体至少是字体的宽度时,要更优雅。
#define FOO 16000000000U
#define CLOCK_FREQUENCY (((uint32_t) 1) * FOO)
注意事项:
在 C 中,16000000UL
不是文字,而是常量。 字面量 可以使用它们的地址。
此外,L
在16000000UL
仅用于扩大常数,在本例中至少为 unsigned long
.用long
作为 64 位,可能不需要这种扩展。
16000000U
足以形成所需宽度的常量。
UL
不强制常量为 unsigned long
,但只有至少 unsigned long
. 16000000000UL
可能是类型 unsigned long long
.
关于c - 如何将类型分配给宏定义的数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48305691/