Defer Implementation em C
O conceito de adiamento no estilo Go, que permite uma limpeza de recursos limpa e concisa, ganhou popularidade em C . No entanto, encontrar uma implementação de biblioteca padrão ou com bom suporte para esse recurso pode ser um desafio.
Apesar da ausência de suporte integrado para defer na Standard Template Library (STL) ou Boost, existem implementações externas disponíveis . Uma dessas implementações é uma solução leve e sem sobrecarga:
#ifndef defer
struct defer_dummy {};
template struct deferrer { F f; ~deferrer() { f(); } };
template deferrer operator*(defer_dummy, F f) { return {f}; }
#define DEFER_(LINE) zz_defer##LINE
#define DEFER(LINE) DEFER_(LINE)
#define defer auto DEFER(__LINE__) = defer_dummy{} *[&]()
#endif // defer
Esta implementação requer configuração mínima e pode ser facilmente integrada à sua base de código. A sintaxe é direta:
defer { statements; };
Por exemplo, no trecho de código a seguir, a operação fclose é executada automaticamente quando o escopo da função read_entire_file é encerrado:
auto file = std::fopen(filename, "rb");
if (!file)
return false;
defer { std::fclose(file); }; // don't need to write an RAII file wrapper.
// ...
Esta implementação de sobrecarga zero oferece uma maneira conveniente e eficiente de gerenciar a limpeza de recursos em C , fornecendo um recurso de adiamento semelhante ao Go sem a necessidade de classes RAII complexas ou técnicas de gerenciamento de memória personalizadas.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3