Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah anda boleh melaksanakan ciri \"tunda\" dalam C tanpa bergantung pada perpustakaan STL atau Boost?

Bagaimanakah anda boleh melaksanakan ciri \"tunda\" dalam C tanpa bergantung pada perpustakaan STL atau Boost?

DDD
DDDasal
2024-11-01 22:32:29286semak imbas

How can you implement a

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{} *[&amp;]()
#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:

  • Sifar overhed: Tidak seperti beberapa pelaksanaan lain, pendekatan ini tidak memerlukan sebarang overhed tambahan.
  • Ringkas dari segi sintaksis: Sintaks direka bentuk agar mudah dibaca dan digunakan.
  • Sifar kebergantungan: Pelaksanaan ini tidak bergantung pada mana-mana perpustakaan luaran, mengurangkan masa penyusunan.
  • Fleksibel: Blok penangguhan boleh mengandungi sebarang pernyataan atau ungkapan C yang sah.

Nota:

  • Nama objek penangguhan tempatan bermula dengan zz_ dan bukannya _ untuk mengelakkan Pencemaran Ruang Nama.
  • Pengecam pengguna tidak seharusnya bermula secara teknikal dengan garis bawah.

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn