【发布时间】:2019-07-10 05:48:41
【问题描述】:
我有一个大小为 1 字节的位域结构“结构错误”,我使用掩码“ERR_MASK”使用它的数据,如下面的代码所示。 我的要求是,如果结构的类型发生变化,则需要对掩码进行相应的调整。
由于我是从另一个组件或模块(以下代码中的 file1.h)导入此结构类型, 我想在我的源文件(下面代码中的file2.c)中定义这种结构类型“struct copy_errors”的副本,并检查它是否已更改为file1.h中的原始类型, 如果不匹配,我想从 file2.c 中抛出一个编译错误。谁能告诉我如何实现这一目标?或者有没有其他方法可以做到这一点? 注意:我不想通过其元素访问“结构错误”。
/*file1.h*/
struct errors
{
unsigned char err0 :1;
unsigned char err1 :1;
unsigned char err2 :1;
unsigned char err3 :1;
unsigned char err4 :1;
unsigned char err5 :1;
unsigned char reserved1 :1;
unsigned char reserved2 :1;
};
/*file2.c*/
#include "file1.h"
#define ERR_MASK 0xFCU
struct copy_errors
{
unsigned char err0 :1;
unsigned char err1 :1;
unsigned char err2 :1;
unsigned char err3 :1;
unsigned char err4 :1;
unsigned char err5 :1;
unsigned char reserved1 :1;
unsigned char reserved2 :1;
};
bool function(struct err*)
{
bool ret=0;
unsigned char * err_ptr;
err_ptr = (unsigned char *) err;
if (((*err_ptr) & ERR_MASK) != 0U)
{
ret = 1;
}
return ret;
}
【问题讨论】:
-
为什么需要创建结构的副本?为什么不能使用实际结构本身?如果它们不同步,拥有一个结构的副本只会导致维护噩梦。
-
另外,两种不同的结构就是两种不同的结构。对于 C 编译器,它们实际上是两种不同的结构,它们之间根本没有关系。这当然意味着如果它们不匹配,就没有办法得到构建错误。
-
您可以使用某种
diff工具,但我认为语言本身没有任何方法。 -
这个
struct* err不是有效的C,顺便说一句。 -
if (((*err_ptr) & ERR_MASK) != 0U)不可移植。您正在假设实际上依赖于实现的位布局。顺便说一句,检查此类事情的一种方法是依靠手动和可靠的(是否存在)版本控制。
标签: c