Defer-Implementierung in C
Das Konzept der Verzögerung im Go-Stil, das eine saubere und präzise Ressourcenbereinigung ermöglicht, hat in C an Popularität gewonnen . Allerdings kann es eine Herausforderung sein, eine standardmäßige oder gut unterstützte Bibliotheksimplementierung für diese Funktion zu finden.
Obwohl in der Standard Template Library (STL) oder Boost keine integrierte Unterstützung für Defer vorhanden ist, sind externe Implementierungen verfügbar . Eine solche Implementierung ist eine schlanke Lösung ohne Overhead:
#ifndef defer
struct defer_dummy {};
template struct deferrer { F f; ~deferrer() { f(); } };
template deferrer 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
Diese Implementierung erfordert nur minimale Einrichtung und kann problemlos in Ihre Codebasis integriert werden. Die Syntax ist einfach:
defer { statements; };
Im folgenden Codeausschnitt wird beispielsweise der fclose-Vorgang automatisch ausgeführt, wenn der Bereich der Funktion read_entire_file verlassen wird:
auto file = std::fopen(filename, "rb");
if (!file)
return false;
defer { std::fclose(file); }; // don't need to write an RAII file wrapper.
// ...
Diese Zero-Overhead-Implementierung bietet eine bequeme und effiziente Möglichkeit, die Ressourcenbereinigung in C zu verwalten und stellt eine Go-ähnliche Verzögerungsfunktion bereit, ohne dass komplexe RAII-Klassen oder benutzerdefinierte Speicherverwaltungstechniken erforderlich sind.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3