C 語言中的 Defer 實作
Go 風格的 defer 概念允許乾淨簡潔的資源清理,在 C 語言中已經很流行。然而,為此功能找到標準或支援良好的庫實現可能具有挑戰性。
儘管標準範本庫 (STL) 或 Boost 中缺乏對 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>
此實作需要最少的設置,並且可以輕鬆整合到您的程式碼庫中。語法很簡單:
<code class="cpp">defer { statements; };</code>
例如,在下面的程式碼片段中,當退出read_entire_file 函數的作用域時,會自動執行fclose 操作:
<code class="cpp">auto file = std::fopen(filename, "rb"); if (!file) return false; defer { std::fclose(file); }; // don't need to write an RAII file wrapper. // ...</code>
這個零- 開銷實作提供了一種方便有效的方法來管理C 中的資源清理,提供類似Go 的延遲功能,而不需要複雜的RAII 類別或自訂記憶體管理技術。
以上是如何在不犧牲性能的情況下在 C 中實現 Go 風格的延遲?的詳細內容。更多資訊請關注PHP中文網其他相關文章!