Ошибка неверных аргументов при передаче макросов в c ++

0

Существует такая функция, как:

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))
  • 0
    А что такое _IOR(...) ?
  • 0
    @Praetorian _IOR определен в ioctl.h .
Показать ещё 8 комментариев
Теги:
c++11

1 ответ

0

Ваше определение KVM_NITRO_GET_SREGS "вызывает" _IOR с третьим аргументом struct kvm_sregs. Из определения _IOR, казалось бы, возможно, что sizeof(struct kvm_sregs) может быть более уместным. Или, возможно, у вас есть аргументы из строя, поскольку первый аргумент _IOR должен быть type, но я не уверен, что KVMIO расширяется до...

Ищите другие места, где _IOR используется в других драйверах и имитирует их.

  • 1
    Как видно из _IOR ядра Linux , третий аргумент _IOR должен быть типом. Макрос поместит sizeof() вокруг него.
  • 0
    @sharth Хорошо, похоже, так оно и есть. Кажется немного странным, что аргумент size для макроса на самом деле не должен быть размером, а должен быть типом. Ах, хорошо, я уверен, что это не единственная странная вещь в исходном коде ядра ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню