ホームページ  >  記事  >  バックエンド開発  >  STL や Boost ライブラリに依存せずに C で「延期」機能を実装するにはどうすればよいでしょうか?

STL や Boost ライブラリに依存せずに C で「延期」機能を実装するにはどうすればよいでしょうか?

DDD
DDDオリジナル
2024-11-01 22:32:29286ブラウズ

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>

使用法:

遅延マクロは、特定のスコープ内で使用して、そのスコープの終了時に実行されるコードのブロックを定義できます。構文は次のとおりです。

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

例:

次の例では、遅延マクロが read_entire_file 関数内で使用され、次の場合に入力ファイルを自動的に閉じます。関数の終了:

<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 ステートメントまたは式を含めることができます。

注:

  • 名前空間の汚染を避けるため、ローカル遅延オブジェクトの名前は _ ではなく zz_ で始まります。
  • ユーザー識別子は技術的にはアンダースコアで始まるべきではありません。

以上がSTL や Boost ライブラリに依存せずに C で「延期」機能を実装するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。