Maison >développement back-end >Golang >Comment implémenter une fonctionnalité « différer » en C sans compter sur les bibliothèques STL ou Boost ?

Comment implémenter une fonctionnalité « différer » en C sans compter sur les bibliothèques STL ou Boost ?

DDD
DDDoriginal
2024-11-01 22:32:29412parcourir

How can you implement a

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{} *[&amp;]()
#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 :

  • Zéro surcharge : Contrairement à certaines autres implémentations, cette approche n'entraîne aucune surcharge supplémentaire.
  • Syntaxiquement concis : La syntaxe est conçue pour être facile à lire et à utiliser.
  • Zéro dépendance : Cette implémentation ne repose pas sur toutes les bibliothèques externes, réduisant ainsi les temps de compilation.
  • Flexible : Le bloc defer peut contenir n'importe quelle instruction ou expression C valide.

Remarque :

  • Le nom de l'objet différé local commence par zz_ au lieu de _ pour éviter la pollution de l'espace de noms.
  • Les identifiants d'utilisateur ne doivent techniquement pas commencer par un trait de soulignement.

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