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

时间:2010-08-17 02:14:16

标签: c++ windows visual-c++ void-pointers

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

我不跟随。即使在-ansi -pedantic -Wall上,GCC也从不抱怨void *指针算法。有什么问题?

这是代码 -

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 个答案:

答案 0 :(得分:12)

您无法在void *指针上进行指针数学运算。将oData->bufposoData->anotherConstVoidPtr转换为编译器知道如何处理的内容。由于您似乎在寻找可能以字节为单位的大小,因此转换为char *应该有效:

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

答案 1 :(得分:4)

在线:

if ( oData->bufpos ...

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

对于指针运算,void *没有大小,因此采用偏移量或执行其他指针运算没有意义。如果要将其偏移多个字节,则将其强制转换为char *:

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

在提供更多代码/背景后编辑

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

答案 2 :(得分:1)

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

我怀疑在标准允许的范围内使用'void'是不正确的。