gpt4 book ai didi

C++ 为什么我们需要显式地从一种类型转换为另一种类型?

转载 作者:太空狗 更新时间:2023-10-29 23:39:20 28 4
gpt4 key购买 nike

我最近在写一些代码,发现自己做了很多 C 风格的转换,例如:

Client* client = (Client*)GetWindowLong(hWnd, GWL_USERDATA);

我心想;为什么我们实际上需要做这些?

我有点理解为什么在有很多代码的情况下需要这样做,编译器可能无法将哪些类型转换为什么,例如在使用反射时。

但是当从 long 转换为两个类型大小相同的指针时,我不明白为什么编译器不允许我们这样做?

最佳答案

when casting from a long to a pointer where both types are of the same size, I don't understand why the compiler would not allow us to do this?

具有讽刺意味的是,这是编译器干预最重要的地方!

在绝大多数情况下,在 long 和指针之间进行转换是一个编程错误,即使您的平台允许,您也不想被忽视。

比如你写这个的时候

unsigned long *ptr = getLongPtr();
unsigned long val = ptr; // Probably an error

几乎可以肯定您在 ptr 前面漏掉了一个星号:

unsigned long val = *ptr; // This is what it should be

在没有编译器帮助的情况下查找此类错误非常困难,因此编译器希望您告诉它您知道何时进行此类转换。

此外,在一个平台上很好的东西可能在其他平台上不起作用。例如,整数类型和指针在 32 位平台上可能具有相同的大小,但在 64 位平台上具有不同的大小。如果您想保持任何程度的可移植性,即使在大小相同的 32 位平台上,编译器也应该警告您进行转换。编译器警告将帮助您识别错误,并切换到可移植的整型指针类型 intptr_t .

关于C++ 为什么我们需要显式地从一种类型转换为另一种类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36844841/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com