Walaupun makro tidak terus berkembang secara rekursif, terdapat teknik pintar untuk mencapai fungsi yang serupa.
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)))
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
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!