Implémentation différée en C
Le concept de report de style Go, qui permet un nettoyage propre et concis des ressources, a gagné en popularité en C . Cependant, trouver une implémentation de bibliothèque standard ou bien prise en charge pour cette fonctionnalité peut s'avérer difficile.
Malgré l'absence de prise en charge intégrée du report dans la bibliothèque de modèles standard (STL) ou Boost, des implémentations externes sont disponibles. . L'une de ces implémentations est une solution légère et sans surcharge :
#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
Cette implémentation nécessite une configuration minimale et peut être facilement intégrée à votre base de code. La syntaxe est simple :
defer { statements; };
Par exemple, dans l'extrait de code suivant, l'opération fclose est automatiquement exécutée lorsque la portée de la fonction read_entire_file est quittée :
auto file = std::fopen(filename, "rb");
if (!file)
return false;
defer { std::fclose(file); }; // don't need to write an RAII file wrapper.
// ...
Cette implémentation sans surcharge offre un moyen pratique et efficace de gérer le nettoyage des ressources en C , fournissant une fonctionnalité de report de type Go sans avoir besoin de classes RAII complexes ou de techniques de gestion de mémoire personnalisées.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3