Peluasan Makro Variadik MSVC: Asas dan Penyelesaian
Dalam bidang pengaturcaraan C, pengembangan makro boleh menjadi alat yang berkuasa untuk memanipulasi dan menjana kod dengan cepat. Walau bagaimanapun, tidak semua penyusun mengendalikan makro variadic, yang membenarkan bilangan argumen yang berubah-ubah, dengan cara yang sama. Pengkompil Visual C (MSVC) Microsoft, khususnya, mempunyai gelagat yang berbeza apabila ia berkaitan dengan makro sedemikian.
Masalah: Penggabungan Hujah yang Tidak Diinginkan
Pertimbangkan makro variadik yang ditakrifkan sebagai berikut dalam GCC:
<code class="c++">#define VA_NARGS(...) VA_NARGS_IMPL(__VA_ARGS__, 5, 4, 3, 2, 1)</code>
Makro ini bertujuan untuk mengira bilangan hujah yang dihantar kepada ia. Walau bagaimanapun, apabila dikembangkan dalam GCC, ia menganggap setiap hujah sebagai individu dengan betul, memberikan kita kiraan yang diingini. Dalam MSVC, walau bagaimanapun, semua hujah digabungkan menjadi satu hujah.
Penyelesaian: Makro Bersarang dan Lebih Muatan
Untuk mencapai pengembangan makro variadic dalam MSVC , kita boleh menggunakan teknik yang melibatkan makro bersarang dan lebihan muatan. Kod berikut menunjukkan pendekatan ini:
<code class="c++">#define GLUE(x, y) x y #define RETURN_ARG_COUNT(_1_, _2_, _3_, _4_, _5_, count, ...) count #define EXPAND_ARGS(args) RETURN_ARG_COUNT args #define COUNT_ARGS_MAX5(...) EXPAND_ARGS((__VA_ARGS__, 5, 4, 3, 2, 1, 0)) #define OVERLOAD_MACRO2(name, count) name##count #define OVERLOAD_MACRO1(name, count) OVERLOAD_MACRO2(name, count) #define OVERLOAD_MACRO(name, count) OVERLOAD_MACRO1(name, count) #define CALL_OVERLOAD(name, ...) GLUE(OVERLOAD_MACRO(name, COUNT_ARGS_MAX5(__VA_ARGS__)), (__VA_ARGS__))</code>
Contoh Penggunaan:
Dengan penyelesaian ini, kami boleh menentukan makro variadik yang berkelakuan secara konsisten merentas penyusun. Sebagai contoh, makro pelaporan ralat berikut:
<code class="c++">#define ERROR(...) CALL_OVERLOAD(ERROR, __VA_ARGS__)</code>
boleh digunakan untuk mengeluarkan ralat dengan bilangan argumen yang berubah-ubah:
<code class="c++">ERROR("Error: %s", errorMessage); // single argument ERROR("Error: %s", errorMessage, "Additional details"); // two arguments</code>
Cerapan Utama:
Atas ialah kandungan terperinci Bagaimana untuk Mencapai Pengembangan Makro Variadic dalam MSVC?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!