gpt4 book ai didi

c - 从预处理器中的常量中删除强制转换

转载 作者:太空狗 更新时间:2023-10-29 17:15:52 25 4
gpt4 key购买 nike

背景

在微 Controller 代码中,我使用了生产者提供的库,其中定义了许多常量。如果我的某些常量(与微 Controller 外部的组件共享,使用 git-subtree)与微 Controller 常量不匹配,我将尝试给出错误。

例如,库定义:

#ifdef SOME_PARTICULAR_MODEL
#define FLASH_BLOCK_SIZE ((uint8_t)64)
/* else, other models */
#endif

在某处,在微 Controller 代码和 PC 上编译的一些代码之间共享的 header 中,我有例如:

#define MYPROG_BLOCK_SIZE 64

为了确保这些常量在微 Controller 代码中匹配,在这两个常量都存在的地方,我有:

#if MYPROG_BLOCK_SIZE != FLASH_BLOCK_SIZE
#error "mismatch between actual block size and defined block size"
#endif

这是为了确保如果代码被移植到更大的微 Controller ,共享 header 也会更新。

问题

问题是这会减少到:

#if 64 != ((uint8_t)64)

我不确定它是否是有效的 C,但仍然会使编译器阻塞。测试后,我发现问题不在于 uint8_t 是一个 typedef,它仍然会因强制转换为 int 而窒息。

问题

有没有办法从定义为 ((uint8_t)64) 的值中删除 (uint8_t) 部分?如果不是,有没有什么办法可以改变它,使表达式变成一个没有强制转换的表达式?

我考虑过将 uint8_t 定义为某种东西并在 #if 之后取消定义它,但我不知道如何避免 的转换性质(Y)X 并将其转化为算术表达式。

最佳答案

这是一个改进的版本(下面是第一个版本)。这一个不依赖于转换为 uint8_t;它将与 ((some type) number) 形式的任何 FLASH_BLOCK_SIZE 替换列表一起使用。

#define MYPROG_BLOCK_SIZE   64
#define FLASH_BLOCK_SIZE ((uint8_t)64)

#define B(x)
#define C(x) B x
#define D(x) C x

#if MYPROG_BLOCK_SIZE != D(FLASH_BLOCK_SIZE)
#error "mismatch between actual block size and defined block size"
#endif

这个有效:

  • D(FLASH_BLOCK_SIZE) 中,FLASH_BLOCK_SIZE 被替换为 ((uint8_t) 64),有效地使 D((( uint8_t) 64)).
  • 然后 D(((uint8_t) 64)) 被替换为 C ((uint8_t) 64)
  • 这是对 C 宏的调用,它将 C(x) 替换为 B x,因此 C (( uint8_t) 64) 替换为 B (uint8_t) 64
  • 在那里,B (uint8_t) 调用了 B 宏,它有一个空的替换列表,所以 B (uint8_t) 64 变成了64

这是原始版本:

#define MYPROG_BLOCK_SIZE  64
#define FLASH_BLOCK_SIZE ((uint8_t)64)

#define uint8_t
#define Helper(x) x
#define Deparenthesize(x) Helper x

#if MYPROG_BLOCK_SIZE != Deparenthesize(Deparenthesize(FLASH_BLOCK_SIZE))
#error "mismatch between actual block size and defined block size"
#endif
#undef uint8_t

在编写代码时,我更喜欢静态断言,但上面的内容可以满足您在预处理器中的要求。

关于c - 从预处理器中的常量中删除强制转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19406246/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com