c - 如何将类型分配给宏定义的数字?

标签 c macros

总的来说,我有点理解整数文字在宏中的工作方式。因此,如果我想在宏中将某些内容定义为 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不是文字,而是常量字面量 可以使用它们的地址。

此外,L16000000UL仅用于扩大常数,在本例中至少为 unsigned long .用long作为 64 位,可能不需要这种扩展。 16000000U足以形成所需宽度的常量。

UL不强制常量为 unsigned long ,但只有至少 unsigned long . 16000000000UL可能是类型 unsigned long long .

关于c - 如何将类型分配给宏定义的数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48305691/

相关文章:

c++ - 为什么 SSE set (_mm_set_ps) 会颠倒参数的顺序

c++ - 什么是PC物化?

c - 在C中写入9位二进制数据

c - 如何在没有 valgrind 提示的情况下使结构指向自身

c - 如果使用函数,编译器会发出警告

c - 为什么我必须在 Objective-C 中仅在某些时候编写 *myPointerVar?

c++ - 模板定义宏

macros - Clojure - 如何让我的宏在系统宏之前展开?

macros - 如何使用with语法宏

emacs - 将键盘宏应用于 Emacs 中的事件区域