Maison >développement back-end >Golang >Comment implémenter la fonctionnalité Defer en C ?

Comment implémenter la fonctionnalité Defer en C ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-01 14:04:291021parcourir

How to Implement Defer Functionality in C  ?

Qu'est-ce que l'implémentation Standard Defer/Finalizer en C ?

Le concept de fonctions « différer », inspiré de Go, permet un report exécution des tâches spécifiées après la sortie de la portée actuelle. Cela permet le nettoyage des ressources, la journalisation ou d'autres actions qui doivent être déclenchées lorsqu'un point spécifique du code est atteint.

Implémentations STL et Boost

La norme C La bibliothèque (STL) et la bibliothèque Boost ne fournissent pas d'implémentation intégrée d'une classe defer. Cependant, il existe des bibliothèques tierces qui gèrent cette fonctionnalité.

Une implémentation différée personnalisée

Si les bibliothèques externes ne sont pas une option, l'implémentation personnalisée suivante peut être utilisée pour émuler la fonctionnalité de report :

<code class="cpp">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{} *[&amp;]()</code>

Utilisation

Pour utiliser cette implémentation, écrivez simplement :

<code class="cpp">defer { statements; };</code>

Exemple

Considérez le code suivant :

<code class="cpp">#include <cstdio>
#include <cstdlib>

defer { std::fclose(file); }; // don't need to write an RAII file wrapper.

// File reading code...

return 0;</code>

Dans cet exemple, le bloc defer garantit que le fichier est fermé, que la fonction renvoie avec succès ou non.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn