Ошибка выполнения арифметики указателя на void * в MSVC

Error    1    error C2036: 'const void *' : unknown size    file.cpp     111

Я не следую. GCC никогда не жалуется на арифметику указателей void * даже на -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
     ...

Ответ 1

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

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

Ответ 2

В строке:

if ( oData->bufpos ...

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

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

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

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

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

Ответ 3

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

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