Rumah pembangunan bahagian belakang C++ 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?

Nov 05, 2024 pm 02:29 PM

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

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

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 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

Tag artikel panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Langkah Format Fungsi Fungsi C Langkah Penukaran Kes Langkah Format Fungsi Fungsi C Langkah Penukaran Kes Mar 03, 2025 pm 05:53 PM

Langkah Format Fungsi Fungsi C Langkah Penukaran Kes

Gulc: Perpustakaan C dibina dari awal Gulc: Perpustakaan C dibina dari awal Mar 03, 2025 pm 05:46 PM

Gulc: Perpustakaan C dibina dari awal

Apakah jenis nilai yang dikembalikan oleh fungsi bahasa C? Apa yang menentukan nilai pulangan? Apakah jenis nilai yang dikembalikan oleh fungsi bahasa C? Apa yang menentukan nilai pulangan? Mar 03, 2025 pm 05:52 PM

Apakah jenis nilai yang dikembalikan oleh fungsi bahasa C? Apa yang menentukan nilai pulangan?

Apakah definisi dan peraturan panggilan fungsi bahasa C dan apakah itu Apakah definisi dan peraturan panggilan fungsi bahasa C dan apakah itu Mar 03, 2025 pm 05:53 PM

Apakah definisi dan peraturan panggilan fungsi bahasa C dan apakah itu

Bagaimana Perpustakaan Templat St Standard (STL) berfungsi? Bagaimana Perpustakaan Templat St Standard (STL) berfungsi? Mar 12, 2025 pm 04:50 PM

Bagaimana Perpustakaan Templat St Standard (STL) berfungsi?

Di manakah nilai pulangan fungsi bahasa C yang disimpan dalam ingatan? Di manakah nilai pulangan fungsi bahasa C yang disimpan dalam ingatan? Mar 03, 2025 pm 05:51 PM

Di manakah nilai pulangan fungsi bahasa C yang disimpan dalam ingatan?

Penggunaan dan perkongsian frasa yang berbeza Penggunaan dan perkongsian frasa yang berbeza Mar 03, 2025 pm 05:51 PM

Penggunaan dan perkongsian frasa yang berbeza

Bagaimanakah saya menggunakan algoritma dari STL (jenis, mencari, mengubah, dll) dengan cekap? Bagaimanakah saya menggunakan algoritma dari STL (jenis, mencari, mengubah, dll) dengan cekap? Mar 12, 2025 pm 04:52 PM

Bagaimanakah saya menggunakan algoritma dari STL (jenis, mencari, mengubah, dll) dengan cekap?

See all articles