Ошибка выполнения арифметики указателя на 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" превышает допустимое стандартом.