Aplazar la implementación en C
El concepto de aplazamiento estilo Go, que permite una limpieza de recursos limpia y concisa, ha ganado popularidad en C . Sin embargo, encontrar una implementación de biblioteca estándar o con buen soporte para esta característica puede ser un desafío.
A pesar de la ausencia de soporte integrado para aplazar en la Biblioteca de plantillas estándar (STL) o Boost, hay implementaciones externas disponibles . Una de esas implementaciones es una solución ligera y sin gastos generales:
#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 implementación requiere una configuración mínima y se puede integrar fácilmente en su código base. La sintaxis es sencilla:
defer { statements; };
Por ejemplo, en el siguiente fragmento de código, la operación fclose se ejecuta automáticamente cuando se sale del alcance de la función read_entire_file:
auto file = std::fopen(filename, "rb");
if (!file)
return false;
defer { std::fclose(file); }; // don't need to write an RAII file wrapper.
// ...
Esta implementación sin gastos generales ofrece una manera conveniente y eficiente de administrar la limpieza de recursos en C, proporcionando una función de aplazamiento similar a Go sin la necesidad de clases RAII complejas o técnicas de administración de memoria personalizadas.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3