迭代和比较不同大小的结构元素

Itering and compare struct element with different size

提问人:buch 提问时间:4/29/2022 最后编辑:timraubuch 更新时间:9/5/2022 访问量:61

问:

我有一个棘手的问题,我不知道是否有任何解决方案。

基本上,我已经使用 x-macros 填充了一个结构,例如使用以下宏:

#define X_MACRO_TABLE(_) \
_(var_1 , type1)\
_(var_2, type2)\
_(...., ....)\
_(var_n, type_n)\

我可以有这样的输出:

    typedef struct __attribute__((packed, aligned(1)))
    {
        union {
            struct __attribute__((packed, aligned(1))) data{
                type_1 var_1;
                type_2 var_2;
                ....
                type_n var_n;
            }data_s;
            uint8 DataArray[sizeof(struct data)];
        };
    }data_t;

这是我经常做的事情,而且效果很好。

现在假设我需要定义两个结构:

static data_t   DataVar;
static data_t   DataVar_max;

有什么方法可以使用循环或其他东西将结构的每个元素与其最大值进行比较吗?

DataVar.var_1 > DataVar_max.var_1 ??
DataVar.var_2 > DataVar_max.var_2 ??

或者通过数组,因为我知道类型维度,例如,如果 var_1 等于uint16_t执行如下操作:

(DataVar.DataArray[0]+DataVar.DataArray[1]<<8) > (DataVar_max.DataArray[0]+DataVar_max.DataArray[1]<<8) ??
C 循环 结构 联合 X-宏

评论

0赞 Lundin 4/29/2022
您的意思是如何使用现有的 X 宏代码创建这样的循环吗?显然,你可以在没有宏的情况下创建一个循环,那么为什么你不能这样做呢?
0赞 buch 5/2/2022
我不明白如何在这样的结构中创建循环。你能解释一下吗?
0赞 Lundin 5/2/2022
要么编写一个普通的旧 for 循环,并忽略代码是用 X 宏生成的。或者使用 X 宏进行循环展开类型的调用,如我发布的答案所示,它将作为展开的循环展开。

答:

0赞 Lundin 4/29/2022 #1

假设可以将类型与运算符进行比较,并且两个结构都已初始化,则只需执行以下操作即可:>

#define COMP_MEMBERS(name, type) if (DataVar.name > DataVar_max.name) { do_something(); }
...
X_MACRO_TABLE(COMP_MEMBERS)

这将扩展到每个成员的声明。if

评论

0赞 buch 5/2/2022
这是个好主意,但不幸的是它不起作用,因为我需要连接变量名称。像这样: #define COMP_MEMBERS(name, type) if (DataVar.##name > DataVar_max.##name) { do_something();X_MACRO_TABLE(COMP_MEMBERS),错误如下:“错误:粘贴”DataVar_max“和”'.“不会给出有效的预处理标记”,因为“.”已经是标记
0赞 Lundin 5/2/2022
@buch 将变量名称与什么连接起来?这个例子没有意义,你还需要帮助程序宏来扩展宏参数,然后再进行串联。