Немного предыстории проблемы
, если у меня есть структура, подобная
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
или изменить заголовок for, чтобы использовать idx.val.num
вместоi
?
Для этого предположим, что idx_type
- это перечисление для строковых и числовых типов, а во всех других полях будут макросы, но я собираюсь использовать только макрос IDX_NUM
здесь я не беспокоюсь о том, что делать с idx.type
.
Подводя итог моим проблемам:
- Будет ли он читабельным?Я не хочу оставлять за собой беспорядок, который кто-то прочтет и просто покачал головой ...
- Не рекомендуется ли это?
- Какое из них является лучшим решением?
Поле Struct как счетчик цикла
#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);
}
Это то же самое, что и оригинал, но использование поля / макроса struct расширяет и усложняет заголовок цикла 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);
}
Я не уверен, насколько хорошо это будет в долгосрочной перспективе, или если это не рекомендуется.