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

A S*_*ity 4 c++ windows void-pointers visual-c++

Error    1    error C2036: 'const void *' : unknown size    file.cpp     111
Run Code Online (Sandbox Code Playgroud)

我不跟随.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
     ...
Run Code Online (Sandbox Code Playgroud)

Car*_*rum 11

你不能在指针上做指针数学运算void *.演员oData->bufposoData->anotherConstVoidPtr编译器知道如何处理的东西.因为你似乎在寻找大小,大概是以字节为单位,所以char *应该使用:

if (((char *)oData->bufpos + someSize_t) ...
Run Code Online (Sandbox Code Playgroud)

  • 或者假设`bufpos`指向一系列字节,将其更改为键入`char*`.`void*`最适用于您甚至不希望允许按字节访问的不透明对象句柄. (4认同)

Mer*_*ham 5

在线上:

if ( oData->bufpos ...
Run Code Online (Sandbox Code Playgroud)

bufpos 的类型仍然是 void*。编译器不知道该指针指向什么,因此它会给出该错误。

对于指针算术, void* 没有大小,因此获取偏移量或进行其他指针算术没有意义。如果您想将其偏移多个字节,请将其转换为 char*:

if(((char*)oData->bufpos) + offset ...
Run Code Online (Sandbox Code Playgroud)

给出更多代码/上下文后进行编辑

如果可以的话,尝试使用 char* 而不是 void*。C 地区的人们会知道你在说什么,因为字符是字节,你会省去转换的麻烦。