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

DDD
Freigeben: 2024-11-01 22:32:29
Original
302 Leute haben es durchsucht

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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

<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>
Nach dem Login kopieren

Vorteile:

  • Kein Overhead: Im Gegensatz zu einigen anderen Implementierungen verursacht dieser Ansatz keinen zusätzlicher Overhead.
  • Syntaktisch prägnant: Die Syntax ist so konzipiert, dass sie einfach zu lesen und zu verwenden ist.
  • Keine Abhängigkeiten: Diese Implementierung ist nicht darauf angewiesen auf allen externen Bibliotheken, wodurch die Kompilierungszeiten verkürzt werden.
  • Flexibel:Der Defer-Block kann jede gültige C-Anweisung oder jeden gültigen C-Ausdruck enthalten.

Hinweis:

  • Der Name des lokalen Deferrer-Objekts beginnt mit zz_ anstelle von _, um Namespace Pollution 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!

Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!