delegate.c.

ponteiros abstratos em c
Baixe Agora

delegate.c. Classificação e resumo

Propaganda

  • Rating:
  • Licença:
  • Other/Proprietary Li...
  • Preço:
  • FREE
  • Nome do editor:
  • William Ahern
  • Site do editor:
  • http://25thandclement.com/~william/projects/

delegate.c. Tag


delegate.c. Descrição

Ponteiros de função abstrata em c C Bibliotecas e componentes de aplicativo geralmente fazem uso de chullbacks de função para interface com outro código. Às vezes, a assinatura necessária da chamada de retorno de função é irritante e / ou introduz obscuridade e indirecção que, até agora, uma teve que sofrer silenciosamente.O pacote delegado.c implementa uma espécie de ponteiro de função abstrata, capturando uma assinatura de função (delegado ()) e expondo-o através de uma interface simples (invocar ()). Ele fornece algo frouxamente aproximando expressões de lambda; Ou ainda mais análogos, os delegados C #.A implementação depende das construções de introspecção do tipo GCC e no Libffi. Ambos são amplamente portáteis. Toda a magia na macro Delegate () deve ser constante dobrada por GCC, mesmo no nível de otimização 0. O código gerado não deve ser mais lento do que usar libffi diretamente (no entanto, um pode fazer). A finalidade original deste código foi abstrair a API libevent. A implementação principal é inteiramente genérica. Esta implementação genérica é usada para fornecer um wrapper event_set () / evil_add () event_delegate (). Passando um retorno típico de vazio (*) (int, curto, vazio *) é detectado estaticamente por event_delegate (). Nesse caso, apenas o terceiro argumento é necessário; Os dois primeiros estão implícitos. Libffi é inteiramente contornado neste caso, apresentando uma penalidade de tempo de execução. Isso é útil para a micro-otimização desses poucos retornos de chamada que recebem todo o tráfego.Usage: / * Exemplo simples de delegado () e invocar (). * / struct delegate del = delegate_initializer; delegado (del, my_func, arg1, arg1, ...); invocar (del); / * execute saída (exit_success) no sigterm ou após 60 segundos. * / struct event_delegate event = event_delate_initializer; int sig = sigterm; eventos curtos = ev_signal | ev_persist; struct timeval timeout = {60, 0}; event_delegate (evento, sig, eventos, tempo limite, saída, exit_success); event_dispatch (); Pequeno utilitário de regressão pode ser construído a partir da fonte. Definindo delegate_main exporá a definição principal (). O que há de novo nesta versão: · Corrigir bug que continuamente re-adicionaria o evento, mesmo que já esteja pendente.


delegate.c. Software Relacionado