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 *。キャストoData->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 ...

より多くのコード/コンテキストが与えられた後に編集

できれば、void* の代わりに char* を使用してみてください。文字はバイトであるため、C ランドの人々はあなたが話していることを知っているでしょう。キャストの頭痛の種から解放されます。

于 2010-08-17T02:22:23.640 に答える
1

$3.9.1/9- void 型には空の値セットがあります。void 型は、完成できない不完全型です。値を返さない関数の戻り値の型として使用されます。どの式も cv void (5.4) 型に明示的に変換できます。void 型の式は、式ステートメント (6.2)、コンマ式のオペランド (5.18)、?: の 2 番目または 3 番目のオペランド (5.16)、typeid のオペランド、または戻り値の型が void の関数の return ステートメント (6.6.3) の式。

標準で許可されている範囲を超えた「void」の不適切な使用が疑われます。

于 2010-08-17T02:23:31.140 に答える