Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Fungsi Rekursif Boleh Dicapai dengan Makro C/C?

Bagaimanakah Fungsi Rekursif Boleh Dicapai dengan Makro C/C?

Barbara Streisand
Barbara Streisandasal
2024-12-08 08:32:10174semak imbas

How Can Recursive Functionality Be Achieved with C/C   Macros?

Makro Rekursif dalam C/C

Makro C/C tidak secara langsung menyokong rekursi. Walau bagaimanapun, terdapat cara untuk mencapai kefungsian rekursif menggunakan helah prapemproses.

Pendekatan Menggunakan Ungkapan Tertunda:

Pendekatan ini menggunakan ungkapan tertunda untuk mengelakkan makro daripada dicat biru, sekali gus membolehkannya dikembangkan secara 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))

Sementara pendekatan ini membenarkan pengulangan, ia memerlukan berbilang pengembangan untuk melengkapkan rekursi.

Contoh: Makro Ulangan Rekursif:

Berikut ialah contoh makro ulangan 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

Contoh Penggunaan:

// An example of using the recursive repeat macro
#define M(i, _) i
EVAL(REPEAT(8, M, ~)) // 0 1 2 3 4 5 6 7

Kesimpulan:

Walaupun makro C/C tidak secara langsung menyokong rekursi, adalah mungkin untuk mencapainya melalui helah prapemproses seperti tertunda ungkapan dan makro tersuai. Kaedah ini boleh berguna dalam kes khusus di mana fungsi rekursif diperlukan dalam definisi makro.

Atas ialah kandungan terperinci Bagaimanakah Fungsi Rekursif Boleh Dicapai dengan Makro 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