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{} *[&]() #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 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>
Vorteile:
Hinweis:
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!