理解C 語言中的Golang 風格的Defer
簡介:
簡介:
在語言語言中,概念延遲執行的實現,類似於Golang 的defer,提供了一種在特定函數返回或退出後執行程式碼的便捷方式。
STL 與函式庫實作:從C 開始14 及更高版本,標準範本庫(STL) 或其他函式庫(如Boost)不提供延遲執行模式的直接實現。但是,有幾個第三方程式庫和技術可用於實現此功能。
自訂實作:<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>提供的程式碼片段提供了零開銷、簡單的- defer 的使用實作:
用法:
<code class="cpp">defer { // Code to be executed after the function returns };</code>要使用此實現,只需將defer 放置在函數之後要執行的程式碼範圍之前exits:
範例:
<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>以下範例示範如何使用此defer 實作開啟和讀取文件,並在範圍退出時自動關閉檔案:
優點:
結論:這個自訂defer 實作提供了一種方便且有效率的方法來在C 中實作延遲執行,提供與Golang 的defer 關鍵字類似的功能,而不需要自訂類別或額外的依賴項。
以上是如何在 C 中實作 Golang 風格的 Defer ?的詳細內容。更多資訊請關注PHP中文網其他相關文章!