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

DDD
Lepaskan: 2024-11-01 22:32:29
asal
302 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!