Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Mencapai Pengembangan Makro Variadic dalam MSVC?

Bagaimana untuk Mencapai Pengembangan Makro Variadic dalam MSVC?

DDD
Lepaskan: 2024-11-08 14:47:02
asal
367 orang telah melayarinya

How to Achieve Variadic Macro Expansion in MSVC  ?

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

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

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

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

Cerapan Utama:

  • MSVC mengendalikan pengembangan makro variadic secara berbeza daripada GCC dan lain-lain penyusun.
  • Makro bersarang dan lebihan muatan boleh digunakan untuk mengatasi had MSVC.
  • Teknik ini membolehkan penciptaan mudah alih makro variadik yang dikembangkan dengan betul dalam kedua-dua GCC dan MSVC .

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!

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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan