如何检查c中两个结构类型是否相等?

时间:2019-07-10 05:48:41

标签: c

我有一个1字节大小的位域结构“结构错误”,我正在使用掩码“ ERR_MASK”使用其数据,如下面的代码所示。 我的要求是,如果更改结构的类型,则需要相应地调整遮罩。

由于我正在从另一个组件或模块(下面的代码中的file1.h)导入此结构类型, 我想在我的源文件(下面的代码中的file2.c)中定义此结构类型“ struct copy_errors”的副本,并检查它是否已更改为file1.h中的原始类型, 如果不匹配,我想从file2.c中抛出编译错误。谁能告诉我如何实现这一目标?还是有其他方法可以做到这一点? 注意:我不想使用其元素访问“结构错误”。

for nested in nested_d:
    for country, value in nested_d[nested].items():
        if 'USA' in country:
            US_count.append(value)

print(US_count)

1 个答案:

答案 0 :(得分:2)

C不支持任何等效功能。如果您有支持自定义构建事件的工具链,则可以引入一个名为e的预构建步骤。 G。 python脚本(或您喜欢的任何其他语言)。然后该脚本将:

  • 加载头文件
  • 遍历所有行,直到找到有问题的结构
  • 按所需顺序检查所有已知成员(即未替换任何成员)
  • 最后检查是否到达结构末端(即未添加新成员)

如果工具链停止,如果预构建任务失败,则说明您已经不在了(成功返回0,失败返回其他值),否则,您可以创建一个简单的C文件,成功时为空,并包含一个#error有关失败的指令。

在C代码中,您还可以确保结构的大小匹配:

#define CONCATENATE(X, Y) CONCATENATE_(X, Y)
#define CONCATENATE_(X, Y) X##Y

#define STATIC_ASSERT(CONDITION) \
    typedef int(CONCATENATE(_static_assert_, __LINE__))[(CONDITION)? 1 : -1]

STATIC_ASSERT(sizeof(struct errors) == sizeof(unsigned char));

宏被定义为可重用,但是如果在函数体内使用(由于未使用的本地类型),则可能会产生其他警告。