首頁 > 後端開發 > Golang > 主體

如何在不依賴 STL 或 Boost 函式庫的情況下用 C 實現「延遲」功能?

DDD
發布: 2024-11-01 22:32:29
原創
302 人瀏覽過

How can you implement a

C 中「延遲」功能的自訂實作

在C 中,「延遲」的概念涉及在最後執行特定操作特定範圍或代碼塊的。雖然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{} *[&amp;]()
#endif // defer</code>
登入後複製

用法:

defer 巨集可以在特定範圍內使用來定義在該範圍結束時將執行的程式碼區塊。語法如下:

<code class="cpp">defer {
    // Code to be executed at the end of the current scope
};</code>
登入後複製

範例:

在以下範例中,在read_entire_file 函數中使用defer 宏,在下列情況下自動關閉輸入檔:函數退出:

<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>
登入後複製

好處:

  • 零開銷:與其他一些實作不同,這種方法不會產生任何開銷額外的開銷。
  • 語法簡潔:語法設計為易於閱讀和使用。
  • 零依賴:此實作不依賴在任何外部函式庫上,減少編譯時間。
  • 靈活: defer 區塊可以包含任何有效的 C 語句或表達式。

注意:

  • 本地 deferrer 物件的名稱以 zz_ 而非 _ 開頭,以避免命名空間污染。
  • 從技術上講,使用者識別碼不應以下劃線開頭。

以上是如何在不依賴 STL 或 Boost 函式庫的情況下用 C 實現「延遲」功能?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!