在c++中传递宏时出现无效参数错误

Invalid arguments error when passing macros in c++

本文关键字:无效 参数 错误 c++      更新时间:2023-10-16

有如下函数:

int kvm_vcpu_ioctl(int vcpu_fd,int type, ...)
{
  int ret;
  void *arg;
  va_list ap;
  va_start(ap, type);
  arg = va_arg(ap, void *);
  va_end(ap);
  ret = ioctl(vcpu_fd, type, arg);
  if (ret == -1)
    ret = -errno;
  return ret;
}

,当我想调用它,但传递一个宏作为参数,如:

kvm_vcpu_ioctl(vcpus.fds[vcpu_id],KVM_NITRO_GET_SREGS,sregs);

中定义的宏是:

#define KVM_NITRO_GET_SREGS             _IOR(KVMIO,  0xE9, struct kvm_sregs)

我得到这个错误:

无效参数候选人:Int kvm_vcpu_ioctl(Int, Int,…)

我不为什么?

_IOR:

#define _IOR(type,nr,size)  _IOC(_IOC_READ,(type),(nr),(_IOC_TYPECHECK(size)))

和_IOC是:

#define _IOC(dir,type,nr,size) 
(((dir)  << _IOC_DIRSHIFT) | 
 ((type) << _IOC_TYPESHIFT) | 
 ((nr)   << _IOC_NRSHIFT) | 
 ((size) << _IOC_SIZESHIFT))

您对KVM_NITRO_GET_SREGS的定义"调用" _IOR,第三个参数为struct kvm_sregs。从_IOR的定义来看,sizeof(struct kvm_sregs)可能更合适。或者也许你有参数乱序,因为似乎_IOR的第一个参数应该是type,但我不确定KVMIO扩展到…

查找在其他驱动程序中使用_IOR的其他位置,并模仿它们。