提问人:buch 提问时间:4/29/2022 最后编辑:timraubuch 更新时间:9/5/2022 访问量:61
迭代和比较不同大小的结构元素
Itering and compare struct element with different size
问:
我有一个棘手的问题,我不知道是否有任何解决方案。
基本上,我已经使用 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) ??
答:
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 将变量名称与什么连接起来?这个例子没有意义,你还需要帮助程序宏来扩展宏参数,然后再进行串联。
评论