Aym*_*dou 2 c variadic-functions
我正在开发一个C程序,并被这个警告所困扰.我想使用从列表中检索参数va_arg.
args[i] = (int) va_arg(argptr, int);
Run Code Online (Sandbox Code Playgroud)
要么
args[i] = (char) va_arg(argptr, char);
Run Code Online (Sandbox Code Playgroud)
得到此警告的问题:
... void *' differs in levels of indirection from 'int'...
同样也适用于char案例.对此有何解释?
码:
void test_function(va_list argptr, int (*callback)(),
int ret_typel)
{
int i ;
int arg_typel;
int no_moreb = TRUE;
void *args[MAX_FUNCTION_ARGS];
for (i=0; no_moreb; i++) {
arg_typel = (int)va_arg(argptr, int);
switch(arg_typel) {
case F_INT:
args[i] = (int) va_arg(argptr, int);
break;
case F_CHAR:
args[i] = (char) va_arg(argptr, char);
break;
default:
no_moreb = FALSE;
i--;
break;
}
}
}
Run Code Online (Sandbox Code Playgroud)
Jon*_*ler 10
关于使用的详细点va_arg().
你不能使用:
va_arg(argptr, char);
Run Code Online (Sandbox Code Playgroud)
没有调用未定义的行为(这很糟糕!).可变参数的可变参数函数进行促销活动:float如通过double,并且char,unsigned char,signed char,short,unsigned short进行推广int或unsigned (int)按要求.因此,你永远不能char直接拉va_arg; 您只能指定推广类型.你必须写:
char c = (char) va_arg(argptr, int);
float f = (float) va_arg(argptr, double);
Run Code Online (Sandbox Code Playgroud)
这一次,演员是由于作业而发生的; 说它发生在演员表上并不是绝对必要的,但没有坏处(虽然我可能不会在我自己的代码中编写演员表).