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 :
<code class="cpp">#ifndef defer struct defer_dummy {}; template <class F> struct deferrer { F f; ~deferrer() { f(); } }; template <class F> deferrer<F> 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</code>
Cette implémentation nécessite une configuration minimale et peut être facilement intégrée à votre base de code. La syntaxe est simple :
<code class="cpp">defer { statements; };</code>
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 :
<code class="cpp">auto file = std::fopen(filename, "rb"); if (!file) return false; defer { std::fclose(file); }; // don't need to write an RAII file wrapper. // ...</code>
Ce zéro -l'implémentation en surcharge offre un moyen pratique et efficace de gérer le nettoyage des ressources en C, en 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.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!