在接收各种类型参数的函数中,我使用了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的权利。
答案 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);