'va_start'在函数中用于固定args va_start(ap,flags);

时间:2016-07-11 12:04:36

标签: c++

这个看似简单的代码snipets给了我一个错误,我无法弄清楚:

错误消息为:‘va_start’ used in function with fixed args va_start(ap, flags);

static inline int sgx_wrapper_open64(const char *pathname, int  flags,unsigned int mode) {
   va_list ap; 
   va_start(ap, flags); 
   if (flags & O_CREAT)
      mode = va_arg(ap, mode_t); 
   else
      mode = 0777;
   va_end(ap);  
   int retval;
   ocall_open2(&retval, pathname, flags, mode);
   return retval;
}

2 个答案:

答案 0 :(得分:1)

那是因为va_start(以及所有其他variadic helper "functions")只能用于参数列表以省略号...结尾的函数中。

如果可以的话,你可以修改像

这样的功能
static inline int sgx_wrapper_open64(const char *pathname, int flags, ...)
{
    va_list ap; 
    va_start(ap, flags); 
    mode_t mode;

    if (flags & O_CREAT)
        mode = va_arg(ap, mode_t); 
    else
        mode = 0777;

    va_end(ap);     

    int retval;
    ocall_open2(&retval, pathname, flags, mode);
    return retval;
}

特别注意函数参数列表的更改以及局部变量mode的添加。

答案 1 :(得分:1)

错误消息"'va_start'用于具有固定args的功能"是不言自明的。您的函数有一个固定的参数列表。 va_start只能在具有可变参数列表的函数中使用,这意味着它以省略号结尾,例如:

static inline int sgx_wrapper_open64(const char *pathname, int flags, ...)