Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Rekursi Boleh Ditiru dengan Makro C/C?

Bagaimanakah Rekursi Boleh Ditiru dengan Makro C/C?

Linda Hamilton
Lepaskan: 2024-12-07 08:53:11
asal
995 orang telah melayarinya

How Can Recursion Be Emulated with C/C   Macros?

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))
Salin selepas log masuk

Pelaksanaan Proses

Apabila pr(5) ditemui, langkah berikut berlaku:

  1. pr(5) mengembang kepada ((5 == 1) ? 1 : TUNDA( pr_id)()(5 - 1)).
  2. Prapemproses melukis pr(5) biru (melumpuhkan konteks), menghalangnya daripada berkembang lagi.
  3. TUNDA(pr_id)()(5 - 1) menjadi OBSTRUCT(pr_id)()(5 - 1) dan pr_id () dicat biru.
  4. EXPAND(pr (5)) mengembang kepada ((5 == 1) ? 1 : ((5 - 1 == 1) ? 1 : DEFER(pr_id)()(5 - 1 - 1)))
  5. Peluasan tambahan diperlukan untuk melengkapkan rekursi.

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
Salin selepas log masuk

Makro ini boleh digunakan seperti berikut:

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

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!

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