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中文網其他相關文章!