Implémentation personnalisée d'une fonctionnalité "Différer" en C
En C, le concept de "différer" implique l'exécution d'actions spécifiques à la fin d'une portée ou d'un bloc de code particulier. Bien que les bibliothèques STL (Standard Template Library) et Boost ne fournissent pas d'implémentation intégrée de cette fonctionnalité, une solution personnalisée peut être créée à l'aide de l'extrait de code suivant :
<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>
Utilisation :
La macro defer peut être utilisée dans une portée spécifique pour définir un bloc de code qui sera exécuté à la fin de cette portée. La syntaxe est la suivante :
<code class="cpp">defer { // Code to be executed at the end of the current scope };</code>
Exemple :
Dans l'exemple suivant, la macro defer est utilisée dans la fonction read_entire_file pour fermer automatiquement le fichier d'entrée lorsque la fonction se termine :
<code class="cpp">#include <cstdlib> #include <cstdio> bool read_entire_file(char *filename, std::uint8_t *&data_out, std::size_t *size_out = nullptr) { if (!filename) return false; auto file = std::fopen(filename, "rb"); if (!file) return false; defer { std::fclose(file); }; // don't need to write an RAII file wrapper. // ... Remaining code }</code>
Avantages :
Remarque :
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!