Heim  >  Artikel  >  Backend-Entwicklung  >  Wie können Sie eine „Defer“-Funktion in C implementieren, ohne auf STL- oder Boost-Bibliotheken angewiesen zu sein?

Wie können Sie eine „Defer“-Funktion in C implementieren, ohne auf STL- oder Boost-Bibliotheken angewiesen zu sein?

DDD
DDDOriginal
2024-11-01 22:32:29286Durchsuche

How can you implement a

Benutzerdefinierte Implementierung einer „Defer“-Funktion in C

In C beinhaltet das Konzept von „Defer“ die Ausführung bestimmter Aktionen am Ende eines bestimmten Bereichs oder Codeblocks. Während die STL- (Standard Template Library) und Boost-Bibliotheken keine integrierte Implementierung dieser Funktion bieten, kann eine benutzerdefinierte Lösung mit dem folgenden Code-Snippet erstellt werden:

<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>

Verwendung:

Das Defer-Makro kann innerhalb eines bestimmten Bereichs verwendet werden, um einen Codeblock zu definieren, der ausgeführt wird, wenn dieser Bereich endet. Die Syntax lautet wie folgt:

<code class="cpp">defer {
    // Code to be executed at the end of the current scope
};</code>

Beispiel:

Im folgenden Beispiel wird das Defer-Makro innerhalb der Funktion read_entire_file verwendet, um die Eingabedatei automatisch zu schließen, wenn die Funktion Ausgänge:

<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>

Vorteile:

  • Kein Overhead: Im Gegensatz zu einigen anderen Implementierungen verursacht dieser Ansatz keinen zusätzlichen Overhead .
  • Syntaktisch prägnant: Die Syntax ist Entwickelt, um einfach zu lesen und zu verwenden.
  • Keine Abhängigkeiten: Diese Implementierung ist nicht auf externe Bibliotheken angewiesen, was die Kompilierungszeiten verkürzt.
  • Flexibel: Der Defer-Block kann jede gültige C-Anweisung oder enthalten Ausdruck.

Hinweis:

  • Der Name des lokalen Deferrer-Objekts beginnt mit zz_ statt _, um Namespace-Verschmutzung zu vermeiden.
  • Benutzerkennungen sollten technisch gesehen nicht mit einem Unterstrich beginnen.

Das obige ist der detaillierte Inhalt vonWie können Sie eine „Defer“-Funktion in C implementieren, ohne auf STL- oder Boost-Bibliotheken angewiesen zu sein?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn