背景
在微控制器代码中,我使用的是生产者提供的库,其中定义了许多常量。如果我的一些常量(与微控制器外部的组件共享,带有git-subtree
)和微控制器常量之间存在不匹配,我会尝试给出错误。
例如,该库定义:
#ifdef SOME_PARTICULAR_MODEL
#define FLASH_BLOCK_SIZE ((uint8_t)64)
/* else, other models */
#endif
在某处,在微控制器代码和在 PC 上编译的一些代码之间共享的标头中,例如:
#define MYPROG_BLOCK_SIZE 64
为了确保这些常量匹配,在微控制器代码中,两个常量都存在,我有:
#if MYPROG_BLOCK_SIZE != FLASH_BLOCK_SIZE
#error "mismatch between actual block size and defined block size"
#endif
这是为了确保如果代码曾经移植到更大的微控制器,共享标头也将被更新。
问题
问题是这被简化为:
#if 64 != ((uint8_t)64)
我不确定这是否有效C,但仍然使编译器窒息。测试,我发现问题不在于uint8_t
typedef 并且它仍然会被强制转换int
为例如。
问题
有没有办法(uint8_t)
从定义为的值中删除部分((uint8_t)64)
?如果没有,有什么办法可以改变它,使表达式变成一个没有演员表的表达式?
我考虑过定义uint8_t
为某物并在 之后取消定义它#if
,但我不知道如何避免转换性质(Y)X
并将其转换为算术表达式。