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