背景
在微控制器代码中,我使用生产商提供的库,其中定义了许多常量。如果我的一些常量(与微控制器外部的组件共享,与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
并将其转化为算术表达式。
这是一个改进版本(下面是第一个版本)。这并不取决于演员阵容uint8_t
;它将与任何FLASH_BLOCK_SIZE
表格替换清单((some type) number)
.
#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
这有效:
- In
D(FLASH_BLOCK_SIZE)
, FLASH_BLOCK_SIZE
被替换为((uint8_t) 64)
,有效地使D(((uint8_t) 64))
.
- Then
D(((uint8_t) 64))
被替换为C ((uint8_t) 64)
.
- 这是对
C
宏,它取代C(x)
with B x
, so 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
编写代码时,我更喜欢静态断言,但上面的代码执行了您在预处理器中请求的操作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)