1

私はその古い問題を知っていますが、現在 c++ に変換されている c アプリ (レガシー) の古いロジックを維持するための簡単な解決策は何ですか?

cでその作業:

void *p;
void *response = malloc(60 * 81);

p = response ;
p+=4;

g ++で与える:ISO C ++は、タイプ「void *」のポインターのインクリメントを禁止します更新:
それをchar *に変更すると、このエラーが発生します:

char *p;
char *response = malloc(60 * 81);

error: invalid conversion from ‘void*’ to ‘char*’

また、 char* は short 、 int 、 bool のような他の型 (基本型) を保持できますか? これが、このレガシー コードで使用されている理由です。

4

5 に答える 5

5

最も簡単なのは、 to をキャストするvoid *ことchar *です。ISO C もvoid*算術を禁止しているため、gcc はそれをchar*拡張子として扱います。詳細については、http: //gcc.gnu.org/onlinedocs/gcc-4.7.1/gcc/Pointer-Arith.html#Pointer-Arithを参照してください。

于 2012-07-20T13:28:21.097 に答える
3

gccでのみ動作します。void * 上のポインタの算術は未定義です。その場合、Gcc は char * のように扱います。したがって、レガシー コードを修正する最善の方法は、これらすべてのポインタを慎重に char * に変更することです。

于 2012-07-20T13:29:48.707 に答える
2

最も簡単な方法は、この動作を変更するコンパイラ オプションを探すことです。

char *使用法と意図が一致しているように見えるため、おそらくタイプを に変更するのが最善です。

于 2012-07-20T13:28:36.927 に答える
1

gnu C から C++ への移植は簡単ではありません。算術オンvoid*は C ではなく、拡張機能です。

そのようなものを C++ に移植することは、特に C コードが最初からあまり適切でない場合は、より慎重に行う必要があります。そのデータには「意図した」型があるため、C++ でその型を使用し、char. 明らかに、これは C 文字列であるとは考えられていませんでした。C 文字+= 4列に対して行うことはあまり意味がありません。したがって、基本型のサイズが であるという仮定があります4。おそらく、コードの残りの部分から、これをどのように解釈する必要があるかを推測できます。

適切な型を取得したら、 を使用new[]して配列を割り当てます。malloc回避できる場合は、C++ で使用しないでください。

于 2012-07-20T14:43:30.877 に答える
-2

「ポインティングの算術」のため...あなたがそれを書くなら、 p += 4それは意味します:p += ((sizeof(void *) * 4)

于 2012-07-20T13:27:20.347 に答える