对MSVC中的void *执行指针运算时出错

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

我不跟随。 GCC从不抱怨void *指针算术,甚至在-ansi -pedantic -Wall-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 ... 

你不能在void *指针上做指针数学。 将oData->bufposoData->anotherConstVoidPtr转换为编译器知道如何处理的内容。 因为你似乎正在寻找大小,这大概是以字节为单位,铸造到char *应该工作:

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

在线上:

 if ( oData->bufpos ... 

bufpos的类型仍然是void *。 编译器不知道那个指针指向什么,所以它给了你那个错误。

对于指针运算,void *没有大小,所以取一个偏移量或者做其他指针运算是没有意义的。 将它转换为char *,如果你想通过多个字节来抵消它:

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

更多的代码/上下文后,编辑

如果你能帮助它,请尝试使用char *而不是void *。 在C-land的人会知道你在说什么,因为字符是字节,你可以节省自己头疼的铸造。

$ 3.9.1 / 9-这个void类型有一个空的一组值。 void类型是不能完成的不完整类型。 它被用作不返回值的函数的返回类型。 任何表达式都可以显式转换为cv void(5.4)。 void类型的表达式只能用作表达式语句(6.2),作为逗号表达式(5.18)的操作数,作为?:(5.16)的第二个或第三个操作数,作为typeid的操作数,或者作为表达式在返回语句(6.6.3)中返回类型为void的函数。

我怀疑是不正确地使用了“标准”所允许的“空白”。