Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann ich eine Verzögerung im Golang-Stil in C erreichen?

Wie kann ich eine Verzögerung im Golang-Stil in C erreichen?

DDD
DDDOriginal
2024-11-02 01:26:31531Durchsuche

How Can I Achieve Golang-Style Defer in C  ?

Golang-Style Defer in C verstehen

Einführung:

In C das Konzept Die verzögerte Ausführung bietet, ähnlich wie Golangs Defer, eine bequeme Möglichkeit, Code auszuführen, nachdem eine bestimmte Funktion oder zurückgegeben hat Exits.

STL- und Bibliotheksimplementierungen:

Ab C 14 und höher bieten die Standard Template Library (STL) oder andere Bibliotheken wie Boost keine direkte Implementierung des verzögerten Ausführungsmusters. Es stehen jedoch mehrere Bibliotheken und Techniken von Drittanbietern zur Verfügung, um diese Funktionalität zu erreichen.

Benutzerdefinierte Implementierung:

Das bereitgestellte Code-Snippet bietet eine einfach zu bedienende Lösung ohne Overhead. zu verwendende Implementierung von defer:

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

Verwendung:

Um diese Implementierung zu verwenden, platzieren Sie defer einfach vor dem Codebereich, den Sie ausführen möchten, nachdem die Funktion beendet wurde:

<code class="cpp">defer {
   // Code to be executed after the function returns
};</code>

Beispiel:

Das folgende Beispiel zeigt, wie man dies verwendet Implementierung zum Öffnen und Lesen einer Datei verzögern und die Datei automatisch schließen, wenn der Bereich beendet wird:

<code class="cpp">#include <cstdint>
#include <cstdio>
#include <cstdlib>

bool read_entire_file(char *filename, std::uint8_t *&data_out,
                      std::size_t *size_out = nullptr) {
    ...

    defer { std::fclose(file); }; // Automatically close the file

    ...
}</code>

Vorteile:

Diese Implementierung bietet mehrere Vorteile gegenüber anderen Ansätzen:

  • Kein Overhead, ohne zusätzlichen Laufzeit-Overhead
  • Syntaktisch einfacher und einfacher zu verwenden
  • Keine Abhängigkeiten, reduzierte Kompilierzeiten
  • Kann problemlos überall in der Codebasis eingefügt werden

Fazit:

Diese benutzerdefinierte Defer-Implementierung bietet eine bequeme und effiziente Möglichkeit, eine verzögerte Ausführung in C zu erreichen, und stellt eine ähnliche Funktionalität wie das Schlüsselwort defer von Golang bereit, ohne dass dies erforderlich ist für benutzerdefinierte Klassen oder zusätzliche Abhängigkeiten.

Das obige ist der detaillierte Inhalt vonWie kann ich eine Verzögerung im Golang-Stil in C erreichen?. 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