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

C++ Why do we need to explicitly cast from one type to another?

本文关键字:类型 一种 显式转换 另一种 我们 为什么 C++      更新时间:2023-10-16

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

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

我心想,为什么我们真的需要做这些?

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

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

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

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

在绝大多数情况下,在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

我认为

这个想法是我们希望编译器告诉我们何时在做一些狡猾和/或可能无意的事情。这样我们就不会偶然这样做。所以编译器会抱怨,除非我们明确告诉编译器这是我们真正想要的。我们通过使用 a 强制转换来做到这一点。

编辑添加:

最好问

问为什么允许我们在类型之间进行转换。最初C是作为强类型语言创建的。虽然它允许在相关对象类型之间(如整数和浮点数之间)进行升级/转换,但它应该防止访问和分配给错误的类型作为语言功能,这是一种安全措施。然而,有时这很有用,因此在语言中放置了强制转换,以允许我们在需要的时候规避类型规则。

相关文章: