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
Libérer: 2024-11-01 22:32:29
original
408 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal