首頁  >  文章  >  後端開發  >  為什麼 MSVC 將 VA_ARGS 視為可變參數巨集擴充中的單一參數,以及如何解決這個問題?

為什麼 MSVC 將 VA_ARGS 視為可變參數巨集擴充中的單一參數,以及如何解決這個問題?

Patricia Arquette
Patricia Arquette原創
2024-11-05 14:29:02556瀏覽

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

MSVC 中的可變巨集擴充

在 C 程式設計領域,巨集提供了一種定義可重複使用程式碼片段的便捷方法。然而,當在 Microsoft 的 Visual C (MSVC) 編譯器中探索可變參數巨集時,可能會出現障礙。本文深入研究了開發人員提出的問題,並提出了一種解決方法,以啟用類似於 GCC 中的可變參數巨集擴充。

問題陳述

當前的問題涉及到一個在 GCC 中完美擴展但在 MSVC 中遇到困難的宏。具體來說,該巨集透過將所有 VA_ARGS (變數參數)視為單一參數而發生故障。以下是問題代碼的摘錄:

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

此巨集旨在計算傳遞給它的參數數量。但是,MSVC 錯誤地將所有 VA_ARGS 解釋為一個參數,導致計數不正確。

解決方法

雖然詢問者尋求一種複製技術為了滿足MSVC 中GCC 的期望行為,Jeff Walden 在源線程中提出了一個出色的解決方案。此解決方法需要為每個可變參數巨集宣告一個輔助宏,如下所示:

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

COUNT_ARGS 巨集用於決定傳遞給可變參數宏FOO 的參數數量,輔助宏FOO_CHOOSE_HELPER1和FOO_CHOOSE_HELPER2根據參數計數選擇適當的FOO 重載。

結論

雖然該解決方法有效解決了MSVC 中的可變宏擴展問題,但它需要聲明每個可變參數宏都有一個輔助宏,這對於大型程式碼庫來說可能會變得很麻煩。儘管如此,它為那些在 MSVC 專案中遇到類似挑戰的人提供了一個可行的解決方案。

以上是為什麼 MSVC 將 VA_ARGS 視為可變參數巨集擴充中的單一參數,以及如何解決這個問題?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn