使用 C 預處理器的VA_ARGS
C 中的變數巨集允許使用任意數量的參數。然而,確定傳遞給可變參數巨集的參數數量可能具有挑戰性。本文探討了使用 VA_ARGS 預處理器巨集的簡單且有效率的解決方案。
理解VA_ARGS
VA_ARGS 是內建的預處理器宏,可擴展為傳遞可變參數宏的實際參數。但是,它不提供有關參數數量的任何資訊。
使用整數數組大小計算參數
要確定可變參數巨集中的參數數量,我們可以利用 C 預處理器中數組大小的行為。以下巨集 NUMARGS() 使用此技術:
#define NUMARGS(...) (sizeof((int[]){__VA_ARGS__})/sizeof(int))
此巨集擴展為包含傳遞給它的所有參數的陣列的大小,除以整數的大小。結果值是參數的數量。
用法範例
考慮下列巨集SUM(),它計算其參數的總和:
#define SUM(...) (sum(NUMARGS(__VA_ARGS__), __VA_ARGS__))
要使用SUM(),我們將使用可變數量的參數來呼叫它,例如so:
SUM(1); SUM(1, 2); SUM(1, 2, 3);
NUMARGS()巨集會計算參數的數量,並將其與參數一起傳遞給 sum() 函數。
處理空參數清單
預設情況下,如果使用空參數清單呼叫 NUMARGS() 巨集將會失敗。為了解決這個問題,可以使用 GNU C 擴充來定義巨集的變體:
#define NUMARGS(...) (sizeof((int[]){0, ##__VA_ARGS__})/sizeof(int)-1)
此變體允許空參數列表並正確計算所有情況下的參數數量。
結論
VA_ARGS 預處理器巨集可以用來有效計算可變參數巨集中的參數數量。透過將此技術與整數數組大小操作相結合,我們可以開發有用的巨集來處理 C 中可變數量的參數。
以上是如何確定 C 可變參數巨集中的參數數量?的詳細內容。更多資訊請關注PHP中文網其他相關文章!