学習のために、私は最近、Win32 WriteFile を使用する既存のアセンブリ (Reflector を使用) を調べました。実装は次のとおりです。
Write(IntPtr handleFile, void* bufferData, uint length){
void* buffer = bufferData
while (length > 0)
{
uint wrtn;
if (!WriteFile(handle, buffer, len, out wrtn, IntPtr.Zero))
{
// Do some error handling
}
// This does not compile, because of the cast but also simply because void* does not have += operators (it is unknown size).
buffer += (void*)wrtn;
len -= wrtn;
}
}
実際に問題があるのは最後の 2 行です... 1 つには、コンパイラは、uint を void* にキャストできないと不平を言います。さらに、既知のサイズではないため、 void* で += または + を使用することはできません。
Write(IntPtr handleFile, void* bufferData, uint length){
byte* buffer = (byte*)bufferData
while (length > 0)
{
uint wrtn;
if (!WriteFile(handle, (void*)buffer, len, out wrtn, IntPtr.Zero))
{
// Do some error handling
}
// This works! I can add to a byte*
buffer = buffer + wrtn; // I could also have used buffer += wrtn
len -= wrtn;
}
}
上記のコードは機能しますが、最後の数行は次のようにコンパイルされます。
buffer += (byte*)wrtn;
理由がわかりません。コンパイラがこのように動作する理由を知りたいです。
- このようなキャストを生成するのはなぜですか (また、ユーザーが作成したコードでこれを行うことが受け入れられないのはなぜですか)?
- 最初の例の void* の += 演算子はどうなっていますか? buffer += (void*)wrtn where buffer is void* ???? を生成した元のコード コードは何ですか?