2014-02-25 22 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

相关问题