2016-07-14 162 views
-3

我有一個C函數,它的自定義結構和具有不同類型(整型/串/其他自定義結構...)參數的可變的量。由於結構,函數可以確定每個參數的類型,以便處理它。傳遞變量參數的函數

void doStuff(MyStruct *S,...){ <function code> } 

現在我需要另一個函數,可以傳遞'n'個常量參數到「doStuff」。即是這樣的:

void useDoStuff(Mystruct *S, int n){ //lets say n=4 
    va_list arguments; 
    int i; 
    for(i = 0 ; i < n ; i++){ 
     if(i%2) arguments.add(6); //example condition for the arguments 
     else arguments.add("Hello"); 
    } 
    doStuff(S, arguments); // doStuff(S, "Hello", 6, "Hello", 6); 
} 

當然,這不會工作,因爲va_list的不能這樣使用(它只能用於粗略「可視化」所需要的)。不幸的是,結構和「doStuff」功能都無法更改,我需要找到解決方法。這種解決方法是否存在?

+6

這不是C,它是C++(C沒有明確提及)。這是一個XY問題。你爲什麼試圖創建一個異構的參數列表? 「doStuff」的_actual_定義是什麼? – Tim

+0

是的你是正確的沒有在C中的引用(不知道爲什麼我用它們而不是示例中的指針)。無論如何,doStuff做什麼並不重要,關鍵是我必須傳遞未知數量的常量參數來通過某些條件。 –

+0

Quote:「自然這不會工作,因爲va_list不能像這樣使用(僅用於大致'可視化'需要)」。我的意思是... va_list是否具有「添加」功能? - 沒有。 –

回答

2

C沒有定義任何機構,用於動態地構造變量參數列表。通常,編譯器將可變參數調用轉換爲普通函數調用,使用實現特定的機制來處理調用兩端的參數列表。爲此,編譯器需要知道每個調用的實際參數是什麼。

如果一切最終必須經過可變參數的功能,那麼你所有的選擇都在變化無論是寫多個替代函數調用和動態選擇執行哪一個,或者通過多個函數調用進行的工作。將這些結合起來也許是可能的。

考慮,然而,可變參數函數的行爲的適當部分是否可以被提取出來,它可以直接行使。然後你可以說,提供一個或多個可選的前端,接受數據以結構數組的形式使用,而不是可變參數。