在C varargs中,是否可以发送不同类型的args

时间:2014-02-25 06:05:43

标签: c

在接收各种类型参数的函数中,我使用了varargs, 我正在将所有参数解码为一种类型,如下所示

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]”转换为指针。 超出了使用varargs的权利。

1 个答案:

答案 0 :(得分:5)

不,这不是使用varargs的正确方法。

传递给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);