【发布时间】:2019-05-01 09:45:44
【问题描述】:
问题的一些背景
如果我有类似的结构
typedef struct {
idx_type type;
union {
char *str;
int num;
} val
} cust_idx;
我有这样的循环
for (i = 0; i < some_get(x); i++) {
some_fun(z, NULL, i);
}
我想重构以使用像some_fun(z, idx) 这样的结构,其中idx 是我的cust_idx 结构之一,最好将i 保留为循环计数器并更新idx 或更改标题使用idx.val.num 而不是i?
为此,假设idx_type 是字符串和数字类型的枚举,所有其他字段都有宏,但我这里只使用IDX_NUM 宏,因为我不担心关于与idx.type 相关的任何事情。
总结一下我的担忧:
- 它可读吗?我不想留下一团乱七八糟的东西,有人会读然后摇头......
- 是否建议不要这样做?
- 以下哪个是最佳解决方案?
结构字段作为循环计数器
#define IDX_NUM(x) (x.val.num)
...
cust_idx j;
j.type = TYPE_num;
for (IDX_NUM(j) = 0; IDX_NUM(j) < some_get(x); IDX_NUM(j)++) {
some_fun(z, j);
}
这和原来的一样,但是在我看来,使用结构字段/宏扩展并复杂化了 for 循环头,但它仍然是可以理解的。
用原来的计数器修改结构
cust_idx j;
j.type = TYPE_num;
for (i = 0; i < some_get(x); i++) {
IDX_NUM(j) = i;
some_fun(z, j);
}
这导致在逻辑上对旧代码的更改最少,但由于添加了分配行,最终代码量最大。
指向结构字段的指针
cust_idx j;
int *i = &(j.val.num);
j.type = TYPE_num;
for ((*i) = 0; (*i) < some_get(x); (*i)++) {
some_fun(z, j);
}
我不确定从长远来看这会有多好,或者是否建议不要这样做。
【问题讨论】:
-
我会重构代码,这样
some_fun只接受元素指针而不是整个数组。或者它采用带有元素指针的整个数组或带有索引号的整个数组。但是将索引号存储在对象中很奇怪,我认为反对 OOP - 您将迭代器存储在对象中。您可以沿着readdir_r进行一些思考,但没有函数可以同时接受readdir_r参数和迭代器 - 每个对象都是可感知的并且是一个单独的实体。
标签: c for-loop struct unions readability