(HANDLE是一个没有具体类型的指针可以方便转换成其他类型的指针指针的大小一般和机器字长一样) https://m.toutiao.com/is/ieUEGYhy/?= 学习过Windows API编程的开发者都知道,Windows API中有很多奇怪的数据类型,比如HANDLE,中文翻译为句柄,看看Windows API函数CreateFile: HANDLE CreateFile( LPCTSTR lpFileName, // file name DWORD dwDesiredAccess, // access mode DWORD dwShareMode, // share mode LPSECURITY_ATTRIBUTES lpSecurityAttributes, // SD DWORD dwCreationDisposition, // how to create DWORD dwFlagsAndAttributes, // file attributes HANDLE hTemplateFile // handle to template file); 返回一个HANDLE,也就是返回了一个句柄,这让很多初学者摸不着头脑,难以理解,其实这不能怪初学者,因为在Windows编程中,把HANDLE翻译为句柄,真是一个糟糕的翻译。 这个HANDLE到底是什么类型?原来是一个PVOID类型:
那PVOID到底又是什么类型呢?再进一步探究,原来是一个void类型指针: typedef void * PVOID; 也就是说HANDLE是一个没有具体类型的指针,这样就可以方便转换成其他类型的指针。指针的大小一般和机器字长一样。 在32位系统中,HANDLE的大小是32位,也就是4个字节。 在64位系统中,HANDLE的大小是64位,也就是8个字节。 既然HANDLE的本质是一个指针,为什么要用typedef重新命名为handle呢?handle就是把手的意思,为什么把指针比喻为把手呢?你看看下面的图片就知道了,抽屉,窗户都有把手,用把手我们可以轻松打开或者关闭抽屉或者窗户。 ![]() 抽屉把手 ![]() 窗户把手 Windows系统中有很多复杂的系统对象,通过Windows API调用可以获得这些系统对象的指针,再通过指针就能方便访问Windows系统资源,例如一个文件资源,线程资源等,这就好比通过把手打开或者关闭抽屉或者窗户。 那为什么国内翻译者把HANDLE翻译为句柄这个拗口难懂的翻译呢?因为他们懒惰。根据考证,句柄这个翻译最早来编译器设计理论领域的翻译,最早翻译HANDLE为句柄:
这个在编译器领域没有问题,可以理解。 但是后来的翻译者偷懒,遇到HANDLE就沿用编译器设计理论领域的翻译,完全不顾新的领域的实际情况,这才造成我们今天的困惑。 |
|