相关疑难解决方法(0)

在预处理器中从常量中删除强制转换

背景

在微控制器代码中,我使用的是生产者提供的库,其中定义了许多常量.如果我的一些常量(与微控制器外部的组件共享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并将其转化为算术表达式.

c primitive-types c-preprocessor

6
推荐指数
2
解决办法
1815
查看次数

标签 统计

c ×1

c-preprocessor ×1

primitive-types ×1