Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah MSVC menganggap VA_ARGS sebagai satu hujah dalam pengembangan makro variadic, dan bagaimanakah perkara ini boleh diselesaikan?

Mengapakah MSVC menganggap VA_ARGS sebagai satu hujah dalam pengembangan makro variadic, dan bagaimanakah perkara ini boleh diselesaikan?

Patricia Arquette
Patricia Arquetteasal
2024-11-05 14:29:02556semak imbas

Why does MSVC   treat VA_ARGS as a single argument in variadic macro expansion, and how can this be worked around?

Peluasan Makro Variadik dalam MSVC

Dalam dunia pengaturcaraan C, makro menawarkan cara yang mudah untuk menentukan coretan kod boleh guna semula. Walau bagaimanapun, apabila meneroka makro variadic dalam pengkompil Visual C (MSVC) Microsoft, halangan mungkin timbul. Artikel ini menyelidiki isu yang dibangkitkan oleh pembangun dan membentangkan penyelesaian untuk membolehkan pengembangan makro variadik yang serupa dengan yang terdapat dalam GCC.

Pernyataan Masalah

Isu yang sedang dihadapi melibatkan makro yang berkembang dengan sempurna dalam GCC tetapi menghadapi kesukaran dalam MSVC . Khususnya, makro yang dipersoalkan tidak berfungsi dengan menganggap semua VA_ARGS (argumen pembolehubah) sebagai argumen tunggal. Di bawah ialah petikan kod masalah:

<code class="cpp">#define VA_NARGS_IMPL(__1, __2, __3, __4, __5, N, ...) N
#define VA_NARGS(...) VA_NARGS_IMPL(__VA_ARGS__, 5, 4, 3, 2, 1)</code>

Makro ini direka bentuk untuk mengira bilangan argumen yang dihantar kepadanya. Walau bagaimanapun, MSVC tersilap mentafsir semua VA_ARGS sebagai satu hujah, mengakibatkan kiraan yang salah.

Penyelesaian

Sementara penyiasat mencari teknik untuk meniru tingkah laku yang dikehendaki GCC dalam MSVC , penyelesaian yang cemerlang telah dicadangkan oleh Jeff Walden dalam urutan sumber. Penyelesaian ini memerlukan pengisytiharan makro pembantu untuk setiap makro variadic, seperti yang dilihat di bawah:

<code class="cpp">#define FOO_CHOOSE_HELPER1(macro, count, ...) macro##count(__VA_ARGS__)
#define FOO_CHOOSE_HELPER2(macro, count, ...) FOO_CHOOSE_HELPER1(macro, count)
#define FOO(...) FOO_CHOOSE_HELPER2(FOO, COUNT_ARGS(__VA_ARGS__), __VA_ARGS__)</code>

Makro COUNT_ARGS digunakan untuk menentukan bilangan argumen yang dihantar kepada makro variadic FOO dan makro pembantu FOO_CHOOSE_HELPER1 dan FOO_CHOOSE_HELPER2 pilih lebihan FOO yang sesuai berdasarkan kiraan hujah.

Kesimpulan

Walaupun penyelesaian secara berkesan menangani isu pengembangan makro variadik dalam MSVC , ia memerlukan pengisytiharan makro pembantu untuk setiap makro variadic, yang boleh menyusahkan untuk pangkalan kod yang besar. Namun begitu, ia menyediakan penyelesaian yang berdaya maju bagi mereka yang menghadapi cabaran serupa dalam projek MSVC mereka.

Atas ialah kandungan terperinci Mengapakah MSVC menganggap VA_ARGS sebagai satu hujah dalam pengembangan makro variadic, dan bagaimanakah perkara ini boleh diselesaikan?. 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