C での標準的な遅延/ターミネータの実装
Go 言語の遅延関数は、関数の終了時にコードのブロックを実行する方法です。リソースのクリーンアップとエラー処理を簡素化するメカニズム。この記事では、C での同様の遅延実装の可能性と、既存のライブラリでの代替案の実現可能性を検討します。
既存の実装
C 標準ライブラリ、Boost およびその他のサードパーティ ライブラリは、既製の遅延実装をまだ提供していません。ただし、次の軽量カスタム実装は、Go 言語と同様の機能を提供します。
<code class="cpp">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{} *[&]()</code>
使用法
この実装は、Go 言語の遅延と同じ方法で使用されます。構文は似ています:
<code class="cpp">defer { // 要在函数退出时执行的代码块 };</code>
使用例
<code class="cpp">#include <cstdio> #include <cstdlib> bool read_entire_file(char *filename, std::uint8_t *&data_out, std::size_t *size_out = nullptr) { auto file = std::fopen(filename, "rb"); if (!file) return false; defer { std::fclose(file); }; // 自动关闭文件 // ...其他文件操作代码 return true; } int main(int argc, char **argv) { if (argc < 2) return -1; std::uint8_t *file_data = nullptr; std::size_t file_size = 0; auto read_success = read_entire_file(argv[1], file_data, &file_size); defer { delete[] file_data; }; // 自动释放文件数据 if (read_success) { // ...文件处理代码 return 0; } else { return -1; } }</code>
利点
以上がC は最小限のオーバーヘッドで Go スタイルの遅延機能を実現できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。