Bagaimanakah anda boleh melaksanakan parameter pilihan dalam makro C, dan apakah batasan pendekatan ini?

Mary-Kate Olsen
Lepaskan: 2024-11-14 15:14:02
asal
376 orang telah melayarinya

How can you implement optional parameters in C   macros, and what are the limitations of this approach?

Parameter Pilihan dengan Makro dalam C

Dalam C , makro boleh menjadi alat yang berkuasa untuk penggunaan semula dan pengabstrakan kod. Walau bagaimanapun, mereka juga kekurangan beberapa fleksibiliti yang boleh didapati dalam bahasa pengaturcaraan berorientasikan objek tradisional. Satu ciri sedemikian ialah keupayaan untuk mentakrifkan parameter pilihan dalam makro.

Mentakrifkan Parameter Pilihan

Untuk menentukan parameter pilihan dalam makro, anda boleh menggunakan gabungan senarai argumen dan helah prapemproses. Satu pendekatan biasa ialah menggunakan makro dalam makro untuk menyediakan kefungsian lebihan. Contohnya:

#define PRINT_STRING_1_ARGS(message)              PrintString(message, 0, 0)
#define PRINT_STRING_2_ARGS(message, size)        PrintString(message, size, 0)
#define PRINT_STRING_3_ARGS(message, size, style) PrintString(message, size, style)
Salin selepas log masuk

Di sini, tiga makro (PRINT_STRING_1_ARGS, PRINT_STRING_2_ARGS dan PRINT_STRING_3_ARGS) ditakrifkan, setiap satu dengan bilangan parameter yang berbeza. Untuk memilih makro yang betul berdasarkan bilangan parameter yang diluluskan, helah prapemproses digunakan:

#define GET_4TH_ARG(arg1, arg2, arg3, arg4, ...) arg4
#define PRINT_STRING_MACRO_CHOOSER(...) \
    GET_4TH_ARG(__VA_ARGS__, PRINT_STRING_3_ARGS, \
                PRINT_STRING_2_ARGS, PRINT_STRING_1_ARGS, )
#define PRINT_STRING(...) PRINT_STRING_MACRO_CHOOSER(__VA_ARGS__)(__VA_ARGS__)
Salin selepas log masuk

Makro GET_4TH_ARG mengekstrak argumen keempat daripada senarai argumen pembolehubah (__VA_ARGS__), yang dalam kes ini mewakili makro yang dikehendaki dipanggil.

Penggunaan

Untuk menggunakan mekanisme parameter pilihan, anda boleh menggunakan makro PRINT_STRING seperti berikut:

PRINT_STRING("Hello, World!"); // Call with 1 argument
PRINT_STRING("Hello, World!", 18); // Call with 2 arguments
PRINT_STRING("Hello, World!", 18, bold); // Call with 3 arguments
Salin selepas log masuk

Penghadan

Adalah penting untuk ambil perhatian bahawa pendekatan ini mempunyai beberapa had berbanding dengan terlebih muatan sebenar dalam bahasa berorientasikan objek:

  • Tertib hujah telah ditetapkan. Susunan parameter pilihan tidak boleh diubah .
  • Tidak boleh terlebih muatan berdasarkan jenis hujah. Makro hanya terlebih muatan berdasarkan bilangan argumen, bukan jenisnya.
  • Sukar untuk menggunakan berbilang parameter pilihan . Apabila bilangan parameter pilihan bertambah, takrifan makro boleh menjadi rumit dan sukar untuk dikekalkan.

Atas ialah kandungan terperinci Bagaimanakah anda boleh melaksanakan parameter pilihan dalam makro C, dan apakah batasan pendekatan ini?. 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