Pergunta

Eu estou usando estrutura de lista duplamente ligada de GLib, GLIST. Eu gostaria de saber se há alguma padrão macro para iteração sobre um GLIST. Eu não poderia encontrar qualquer coisa na documentação GLib. Como resultado, eu fiz a minha própria macro, mas eu prefiro usar algo padrão se ele existir.

Para ilustrar o a questão: Normalmente eu escrevo um monte de código que tem esta aparência:

GList *list, *elem;
MyType *item;

for(elem = list; elem; elem = elem->next) {
  item = elem->data;
  /* do something with item */
}

Com uma macro que pode ser reduzido a

GList *list;
MyType *item;

GFOREACH(item, list) {
  /* do something with item */
}

O que é muito menos barulhento.


Nota:. Percebi que GLib fornece uma função foreach para iterar em uma lista e chamar um callback para cada elemento, mas muitas vezes o engano de uma chamada de retorno torna o código mais difícil de ler, especialmente se o retorno de chamada é usada apenas uma vez


Update: vendo como não há nenhuma macro standard, eu estou colocando a macro Eu estou usando aqui no caso de ser de alguma utilidade para alguém. Correções / melhorias são bem-vindos.

#define GFOREACH(item, list) for(GList *__glist = list; __glist && (item = __glist->data, true); __glist = __glist->next)
Foi útil?

Solução

Não existe essa macro.

Eu costumo usar um loop for como no seu exemplo, a menos que os vãos de operação mais de, digamos, quinze linhas, caso em que eu costumo achar que uma função foreach extra com um nome descritivo é mais legível do que a alternativa.

O que você pode não perceber é que você não necessariamente tem que escrever sua própria função foreach:

g_list_foreach(list, (GFunc)g_free, NULL);

liberta cada item na lista, uma operação que muitas vezes eu uso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top