5
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
     ...
4

4 回答 4

11

您不能对指针进行指针数学运算void *。CastoData->bufposoData->anotherConstVoidPtr编译器知道如何处理的东西。由于您似乎正在寻找可能以字节为单位的大小,因此转换为char *应该可以工作:

if (((char *)oData->bufpos + someSize_t) ...
于 2010-08-17T02:22:02.767 回答
4

在线上:

if ( oData->bufpos ...

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

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

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

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

如果您能帮上忙,请尝试使用 char* 而不是 void*。C 领域的人会知道你在说什么,因为 chars 是字节,你可以省去强制转换的麻烦。

于 2010-08-17T02:22:23.640 回答
1

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

我怀疑对“无效”的不当使用超出了标准的允许范围。

于 2010-08-17T02:23:31.140 回答
0

这确实是旧帖子,但即使 Visual Studio 2022 支持 C11 和 c17,如果您尝试将大小添加到 void 指针地址,MSVC 也会返回错误,但对于 GCC,这完全没问题。

void* array_get_ref(const arr_t* this, size_t index)
{
    return this->buffer + (index * this->item_size);
}

要解决 MSVC 上的问题,您需要像这样将 void 指针转换为 char* ,它会正常工作。

void* array_get_ref(const arr_t* this, size_t index)
{
    return (char*)this->buffer + (index * this->item_size);
}

如果我们想一想:任何指针都给了我们内存地址,所以在这种情况下是数组的开头,我们只需要添加字节偏移量,索引* item_size,它在我们创建数组时存储到结构中。(在这种情况下,强制转换只是欺骗 MSVC 编译器)

于 2022-02-17T01:04:55.560 回答