Pelaksanaan Tersuai bagi Ciri "Tunda" dalam C
Dalam C , konsep "tunda" melibatkan pelaksanaan tindakan tertentu pada penghujungnya daripada skop atau blok kod tertentu. Walaupun perpustakaan STL (Perpustakaan Templat Standard) dan Boost tidak menyediakan pelaksanaan terbina dalam ciri ini, penyelesaian tersuai boleh dibuat menggunakan coretan kod berikut:
<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>
Penggunaan:
Makro tangguh boleh digunakan dalam skop tertentu untuk menentukan blok kod yang akan dilaksanakan apabila skop itu tamat. Sintaks adalah seperti berikut:
<code class="cpp">defer { // Code to be executed at the end of the current scope };</code>
Contoh:
Dalam contoh berikut, makro tangguh digunakan dalam fungsi read_entire_file untuk menutup fail input secara automatik apabila fungsi keluar:
<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>
Faedah:
Nota:
Atas ialah kandungan terperinci Bagaimanakah anda boleh melaksanakan ciri \'tunda\' dalam C tanpa bergantung pada perpustakaan STL atau Boost?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!