2014-02-25 19 views
0

的ARGS在其接收各種類型的參數的函數,我已經使用的可變參數, ,我的所有參數的一種類型的解碼,如下在C可變參數,是否有可能發送不同類型

va_start (ap, argCount); 
for (u4Index = 0; u4Index < argCount; u4Index++) 
{  
    ai4Arg[u4Index] = va_arg (ap, int); 
}  
va_end (ap); 

switch (Opt) 
{  
    case 1: 
     func1((int) ai4Arg[0], 
       (int *) ai4Arg[1]); 
     break; 

    case 2: 
     func2((char *) ai4Arg[0], 
       (int *) ai4Arg[1]); 
     break; 
} 

然後我將類型參數轉換爲類型。在嘗試從INT4向一個指針強制轉換參數時,我這樣做,我得到了下面的警告 「強制轉換爲不同大小的整數指針[-Wint-to-pointer-cast]」。 超出了使用可變參數的方式。

+0

部分是,您可以傳遞不同的類型,例如,如果前N個參數的類型相同,並且所有下一個參數都是另一個類型。您需要知道類型的順序,以正確檢索它們 – mangusta

+0

,或者您正在詢問有關情況,當您傳遞所有相同類型時,並且您只是想根據某些「Opt」在函數內部以不同方式查看它們? – mangusta

+0

似乎有點奇怪,你一方面允許可變數量的參數,但無論如何你知道參數類型是什麼 - 它有點挫敗目的,並使代碼更難以維護和錯誤處理將是粗糙的。 –

回答

5

不,這不是使用可變參數的正確方法。

您傳遞給va_arg的類型必須是參數的實際類型。你不能選擇一個隨機類型,然後再進行投射。

也就是說,很有可能您的當前代碼在某些平臺上工作。它可能不適用於其他編譯器。它絕對不會在64位Windows上工作,因爲int是32位,指針是64位 - 所以爲什麼不以正確的方式來做呢?

編輯:

您應該只後調用的va_arg 你知道類型。例如:

va_start (ap, argCount); 
switch (Opt) 
{  
case 1: { 
    int intParam = va_arg(ap, int); 
    int *intPtrParam = va_arg(ap, int*); 
    func1(intParam, intPtrParam); 
    break; 

case 2: 
    char *charPtrParam = va_arg(ap, char*); 
    intPtrParam = va_arg(ap, int*); 
    func2(charPtrParam, intPtrParam); 
    break; 
} 
va_end(ap); 
+0

; 雖然類型轉換如果我在下面做了,它對我來說工作得很好,我沒有得到任何警告(char)(long)ai4Arg [0]是正確的方法嗎? – user3349687

+0

否。正確的方法是給va_arg *正確的類型*。它可能在你的系統上工作,但這是一個不必要的風險,你可能會在以後編譯它,忘記修復這個代碼並被黑客入侵。 – immibis

相關問題