Rumah > pembangunan bahagian belakang > C++ > Bolehkah Kami Mencipta Makro Rekursif dalam Prapemprosesan C/C?

Bolehkah Kami Mencipta Makro Rekursif dalam Prapemprosesan C/C?

Barbara Streisand
Lepaskan: 2024-12-09 11:47:16
asal
171 orang telah melayarinya

Can We Create Recursive Macros in C/C   Preprocessing?

Bolehkah Kita Mempunyai Makro Rekursif?

Walaupun makro tidak terus berkembang secara rekursif, terdapat teknik pintar untuk mencapai fungsi yang serupa.

Penyelesaian untuk Makro Rekursif

Kita boleh menggunakan ungkapan tertunda dan arahan untuk mengelakkan prapemproses daripada melumpuhkan makro semasa pengembangan. Berikut ialah contoh mencipta makro pr rekursif:

#define EMPTY(...)
#define DEFER(...) __VA_ARGS__ EMPTY()
#define OBSTRUCT(...) __VA_ARGS__ DEFER(EMPTY)()
#define EXPAND(...) __VA_ARGS__

#define pr_id() pr
#define pr(n) ((n==1)? 1 : DEFER(pr_id)()(n-1))
Salin selepas log masuk

Makro ini berkembang seperti berikut:

pr(5) -> ((5==1)? 1 : pr_id()(4))
EXPAND(pr(5)) -> ((5==1)? 1 : ((4==1)? 1 : pr_id()(3)))
Salin selepas log masuk

Contoh Makro Ulangan Rekursif

Menggunakan teknik ini, kita boleh mencipta makro REPEAT rekursif:

#define REPEAT(count, macro, ...) \
    WHEN(count) \
    ( \
        OBSTRUCT(REPEAT_INDIRECT) () \
        ( \
            DEC(count), macro, __VA_ARGS__ \
        ) \
        OBSTRUCT(macro) \
        ( \
            DEC(count), __VA_ARGS__ \
        ) \
    )
#define REPEAT_INDIRECT() REPEAT

#define M(i, _) i
EVAL(REPEAT(8, M, ~)) // 0 1 2 3 4 5 6 7
Salin selepas log masuk

Kebolehgunaan dan Had

Walaupun penyelesaian ini mendayakan makro rekursif, adalah penting untuk ambil perhatian bahawa ia boleh menjadi rumit dan mungkin tidak berfungsi dalam semua kes. Adalah disyorkan untuk mendekati penggunaan makro rekursif dengan berhati-hati dan mempertimbangkan alternatif seperti fungsi atau pengaturcaraan meta templat apabila sesuai.

Atas ialah kandungan terperinci Bolehkah Kami Mencipta Makro Rekursif dalam Prapemprosesan C/C?. 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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan