Dalam bidang pengaturcaraan yang memukau, makro menawarkan alat yang berkuasa untuk meningkatkan kecekapan dan kebolehkembangan kod. Makro beroperasi pada tahap teks, membolehkan pembangun memanipulasi dan mentakrifkan semula serpihan kod sebelum penyusunan.
Antara himpunan keupayaan makro, kemungkinan lelaran terhadap hujah makro kekal sebagai misteri yang menarik. Bayangkan senario di mana anda ingin mencipta makro yang melaksanakan operasi tertentu pada setiap hujahnya. Tugasan ini menimbulkan cabaran unik yang akan kami teliti dan tempuhi dalam artikel ini.
Pencarian awal kami adalah untuk mencipta makro yang dipanggil PRINT_ALL yang akan menggunakan PRINT makro kepada setiap hujahnya. Jadi, sebagai contoh:
#define PRINT(a) printf(#a": %d", a) #define PRINT_ALL(...) ???
int a = 1, b = 3, d = 0; PRINT_ALL(a,b,d);
Sebaiknya menghasilkan:
a: 1 b: 3 d: 0
Pendekatan mudah akan melibatkan makro rekursif, tetapi sayangnya, makro tidak secara semula jadi rekursif dalam C. Ini memberikan halangan yang menggerunkan yang memerlukan penyelesaian yang inovatif.
Memanfaatkan rekursi dalam makro memerlukan keseimbangan yang halus antara kepintaran dan pelaksanaan yang teliti. Kuncinya ialah menggunakan satu siri makro yang mensimulasikan tingkah laku rekursif tanpa menggunakan kata kunci rekursif itu sendiri.
1. Pemegang Tempat MAP_OUT:
Kami bermula dengan makro pemegang tempat yang dipanggil MAP_OUT yang berfungsi sebagai sentinel, penimbal teks yang akan menyimpan seruan makro sebagai teks biasa dan bukannya kod. Ini membolehkan kami mengawal aliran rekursi.
2. Makro EVAL:
Seterusnya, kami memperkenalkan makro EVAL, yang bertindak sebagai enjin memacu rekursi kami. Ia menilai teks input secara progresif, mendarabkan lelaran pada setiap peringkat untuk memastikan pemprosesan yang teliti.
3. Mengesan Titik Tamat:
Untuk menghentikan rekursi pada titik akhir yang diingini, kami memperkenalkan makro pemegang tempat lain yang dipanggil MAP_END. Menilai makro ini tidak melakukan apa-apa, dengan berkesan menamatkan rekursi.
4. Makro MAP_NEXT:
Akhir sekali, kita memerlukan cara untuk membezakan antara item senarai semasa dan penanda senarai akhir khas. Makro MAP_NEXT mencapai ini dengan mengembalikan MAP_END jika item semasa sepadan dengan penanda atau hujah seterusnya jika tidak.
Dengan komponen individu ini dipasang, kita boleh sekarang kumpulkan penyelesaian lengkap:
1. Makro MAP0 dan MAP1:
Makro ini mengendalikan kitaran rekursif, menggunakan operasi pada item semasa dan kemudian memeriksa item seterusnya menggunakan makro MAP_NEXT.
2 . Makro PETA ATAS ATAS:
Untuk memulakan rekursi, kami membungkus segala-galanya dalam makro MAP peringkat atas, yang menambah penanda penamat dan menghantar teks yang diubah suai melalui EVAL.
Walaupun tidak betul-betul mudah , pendekatan bulatan ini memperkasakan kami dengan makro rekursif. Hayati keanggunan teknik ini dan manfaatkan kemungkinan tanpa had yang terbuka dalam usaha pengaturcaraan anda.
Atas ialah kandungan terperinci Bagaimana Anda Boleh Mencipta Makro Rekursif dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!