C 語言中的 Defer 實作
Go 風格的 defer 概念允許乾淨簡潔的資源清理,在 C 語言中很受歡迎。然而,為此功能找到標準或支援良好的庫實現可能具有挑戰性。
儘管標準範本庫 (STL) 或 Boost 中缺乏對 defer 的內建支持,但仍有可用的外部實作。其中一個實作是輕量級、零開銷的解決方案:
#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
此實作需要最少的設置,並且可以輕鬆整合到您的程式碼庫中。語法很簡單:
defer { statements; };
例如,在下面的程式碼片段中,當退出read_entire_file 函數的作用域時,自動執行fclose 操作:
auto file = std::fopen(filename, "rb");
if (!file)
return false;
defer { std::fclose(file); }; // don't need to write an RAII file wrapper.
// ...
這種零開銷實作提供了一種方便而有效的方法來管理C 中的資源清理,提供類似Go 的延遲功能,而不需要複雜的RAII 類別或自訂記憶體管理技術。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3