Ошибка выполнения арифметики с указателем на void * в MSVC - PullRequest
4 голосов
/ 17 августа 2010
Error    1    error C2036: 'const void *' : unknown size    file.cpp     111

Я не следую. GCC никогда не жалуется на арифметику пустых * указателей, даже на -ansi -pedantic -Wall. В чем проблема?

Вот код-

struct MyStruct {

    const void *buf;    // Pointer to buffer  
    const void *bufpos; // Pointer to current position in buffer

};

...

size_t    someSize_t, anotherSize_t;
MyStruct *myStruct = (MyStruct *) userdata;
...
  if ( (myStruct->bufpos + someSize_t) > 
       (myStruct->buf + anotherSize_t) ) { // Error on this line
     ...

Ответы [ 3 ]

11 голосов
/ 17 августа 2010

Вы не можете сделать указатель по void * указателю. Приведите oData->bufpos и oData->anotherConstVoidPtr к чему-то, что компилятор знает, как иметь дело. Поскольку вы, похоже, ищете размеры, которые предположительно в байтах, приведение к char * должно работать:

if (((char *)oData->bufpos + someSize_t) ...
4 голосов
/ 17 августа 2010

На линии:

if ( oData->bufpos ...

Тип bufpos по-прежнему не действителен *.Компилятор не знает, на что указывает этот указатель, поэтому он выдает эту ошибку.

Для арифметики с указателем, void * не имеет размера, поэтому брать смещение или делать другую арифметику с указателем не имеет смысла,Приведите его к символу *, если вы хотите сместить его на количество байтов:

if(((char*)oData->bufpos) + offset ...

Отредактировано после того, как было дано больше кода / контекста

Если вы можете помочьпопробуйте использовать char * вместо void *.Люди в C-land будут знать, о чем вы говорите, потому что символы - это байты, и вы избавите себя от головной боли при касте.

1 голос
/ 17 августа 2010

$ 3.9.1 / 9 - тип void имеет пустой набор значений.Тип void является неполным типом, который не может быть завершен.Он используется в качестве типа возврата для функций, которые не возвращают значение.Любое выражение может быть явно преобразовано в тип cv void (5.4).Выражение типа void должно использоваться только как выражение выражения (6.2), как операнд выражения с запятой (5.18), как второй или третий операнд?выражение в выражении возврата (6.6.3) для функции с типом возврата void.

Я подозреваю, что использование 'void' не по назначению превышает допустимое стандартом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...