Makro Rekursif dalam C/C
Makro dalam C/C tidak menyokong rekursi langsung. Walau bagaimanapun, adalah mungkin untuk meniru rekursi melalui gabungan teknik prapemprosesan dan pengasingan.
Contoh Makro seperti Rekursif
Makro berikut mensimulasikan rekursi menggunakan ungkapan tertunda dan arahan:
#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))
Pelaksanaan Proses
Apabila pr(5) ditemui, langkah berikut berlaku:
Makro Ulangan Rekursif
Contoh yang lebih kompleks bagi makro seperti rekursif ialah makro ulangan yang melaksanakan blok kod tertentu yang diberikan bilangan kali:
#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
Makro ini boleh digunakan seperti berikut:
EVAL(REPEAT(8, M, ~)) // 0 1 2 3 4 5 6 7
Batasan
Sambil meniru rekursi melalui makro adalah mungkin , ia secara amnya dianggap sebagai amalan buruk disebabkan oleh potensi implikasi prestasi dan isu kebolehbacaan kod. C Moden menawarkan mekanisme alternatif untuk rekursi, seperti ungkapan lambda dan pengaturcaraan meta templat.
Atas ialah kandungan terperinci Bagaimanakah Rekursi Boleh Ditiru dengan Makro C/C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!