gpt4 book ai didi

c - 如何定义 1 位的无类型字符串

转载 作者:行者123 更新时间:2023-12-02 03:22:58 25 4
gpt4 key购买 nike

我正在为闪存驱动程序编写代码,有时我必须检查某些位置是否为空,即包含 0xff。

有时我检查字节,有时检查更长的值。所以我想要一个定义来捕获一个无类型的 1 位字符串,我可以用它来进行比较。

它应该适用于 8、16 和 32 位宽的有符号和无符号变量。

我尝试了以下两个:

#define ERASED (-1)
#define ERASED (~0)

如果我然后编译以下代码(所有无符号变量):

if (some32bitvar == ERASED)
{
....
}

if (some16bitvar == ERASED)
{
....
}

if (some8bitvar == ERASED)
{
....
}

编译器对 16 位和 32 位变量很满意,但对 8 位变量不满意:

[Warning(ccom)] this comparison is always true 

注意:体系结构和编译器都是 16 位的,所以 int 也是 16 位的。

编译器是正确的,因为它将 some8bitvar 扩展为 int,这会产生 0x00nn。然后它将它与 ERASED 进行比较,ERASED 也扩展为 int,因此产生 0xffff

一个简单的解决方案是使用:

if (~some8bitvar)
{
....
}

但这使用了已删除闪存的隐式知识,我想将其抽象出来,它掩盖了语句的作用。

另一种解决方案是使用:

if (some8bitvar == (typeof(some8bitvar)) ERASED)
{
....
}

但这会使代码不那么清晰,而且我的编译器不支持 typeof 宏。

我如何定义 ERASED 以便对所有类型进行比较?

最佳答案

定义一个宏

 #define IsErased(val) ((~(val))==0)

像这样使用它

 if (IsErased(someXXbitvar)) ...

这会为您提供所需的抽象并保持代码的可读性。

(如果您有现代 C11 编译器,您可以尝试通过重载函数和 _Generic 关键字来实现这一点,为每种类型提供不同的实现)。但我想上述解决方案足以满足您的情况,它非常简单,也适用于较旧的编译器。

关于c - 如何定义 1 位的无类型字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32008350/

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