va_arg返回值警告的标准C类型

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进行推广intunsigned (int)按要求.因此,你永远不能char直接拉va_arg; 您只能指定推广类型.你必须写:

char c = (char) va_arg(argptr, int);
float f = (float) va_arg(argptr, double);
Run Code Online (Sandbox Code Playgroud)

这一次,演员是由于作业而发生的; 说它发生在演员表上并不是绝对必要的,但没有坏处(虽然我可能不会在我自己的代码中编写演员表).