为了学习,我最近查看了一个使用 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;
}
}
实际上是最后两行有问题......首先,编译器抱怨您不能将 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* 上的 += 运算符是怎么回事?哪些原始代码代码生成了缓冲区 += (void*)wrtn 其中缓冲区也是 void* ????