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
Barbara Streisandasal
2024-12-09 11:47:16172semak imbas

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))

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)))

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

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!

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