GEN*_*NER 2 c++ handle void-pointers
因此,我正在阅读有关C 语言句柄的文章,并意识到我们将句柄实现为 void 指针,因此我们获得的“任何”对象/数据类型都可以将 void 指针转换为该类型的对象/数据并获取其值。所以我基本上有两个担忧:
1.如果让我们说下面的例子取自C中的Handle
typedef void* HANDLE;
int doSomething(HANDLE s, int a, int b) {
Something* something = reinterpret_cast<Something*>(s);
return something->doit(a, b);
}
Run Code Online (Sandbox Code Playgroud)
如果我们将值传递给函数dosomething(21,2,2),这是否意味着 HANDLE 指向的值是 21,如果是的话,当我们键入时,任何对象如何将其转换为该对象,它是否能够使用它,就像在这个例子中一样,所以在换句话说,指向对象 Something 的指针something将在哪里存储值 21。
2.其次,该链接还显示“因此,在您的代码中,您只需将 HANDLE 作为不透明值传递”,这实际上是什么意思?为什么我们要“传递句柄”?如果有人能给出更有说服力的使用对象的句柄示例,那就太好了!
1.:句柄是对象的标识符。由于“21”不是对象,而只是一个数字,因此您的函数调用无效。s仅当 ' ' 确实指向类型的结构时,您的代码才会起作用Something。简单地说,句柄只不过是指针,只不过是内存地址,因此“21”将被解释为内存地址,如果您尝试写入它,程序将崩溃
2.:“不透明值”意味着使用您的代码的开发人员不能对句柄标识的对象的内部结构做出任何假设。与指向结构的指针相比,这是一个优势,开发人员可以查看该结构并采取一些假设,而这些假设在您更改代码后将不再成立。“传递”只是意味着:分配它并将其用作函数调用参数,如下所示:
HANDLE s = CreateAnObject();
DoSomethingWithObject( s );
HANDLE t = s;
Run Code Online (Sandbox Code Playgroud)
ETC。
顺便说一句:在实际代码中,您应该为对象指定不同的句柄名称,例如 EMPLOYEE_HANDLE、ORDER_HANDLE 等。句柄的典型示例是 Windows 中的窗口句柄。它们识别窗口,但不会向您提供有关操作系统中如何构建“窗口”内存结构的任何信息,因此微软能够更改此内部结构,而不会因更改“窗口”结构而冒破坏其他开发人员代码的风险。