Visual Studio C++ バージョン 9 (およびおそらく他のバージョンも) では、次のコード:
int a = sizeof(void);
void const *b = static_cast<void const *>("hello world");
b += 6;
error C2070: 'void': illegal sizeof operand
error C2036: 'const void *' : unknown size
このコードは GCC で動作しsizeof(void)
、1
.
char *
ポインター演算の目的で明示的にキャストすると混乱が生じるため、この制限を回避する方法はありますか(void *
生メモリへの型なしポインターとしてよく認識され、使用されます)。
Update0
- 注意してください、私は標準の存在をよく知っています。
- 生のポインタ演算を行いたい。
- それが問題の原因で
sizeof(void)
はないという事実を十分に認識していることを示します。1
- コード例は、エラーを生成するために何が必要かを示すためのものです。
- これが を使用する「通常の」方法ではないことはわかっています
void
が、これは C であり、これらのことが起こります。 - はい、人々はこれを低レベルで行う必要があります。私は理由を求めているのではなく、方法を求めています。理由を知りたい場合は、カーネル ソースまたは使いやすい glibc を参照してください。
アップデート1
この質問は多くの混乱を引き起こしたようです。問題は、なぜ持つことが標準的でないのかということsizeof(void) == 1
ではなく、標準的でない場合にどうするかということです。
1 バイトのポインター演算が行われる場合、 にキャストすることchar *
が正しい答えであることがわかります。*(void *)
これは、 サイズがないからではなく、標準が実際に*(char *)
は常にであると保証しているため1
です。したがって、 の使用は常に正しく、生のポインター演算の目的で GCC 拡張char *
と一致します。void *
ポイントをさらに強化するために、型のvoid *
ないメモリへのポインターの正しい選択であり、生のポインター演算のchar *
キャスト先の正しい型です。