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

Kie*_*ler 2 c++ casting

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

Client* client = (Client*)GetWindowLong(hWnd, GWL_USERDATA);
Run Code Online (Sandbox Code Playgroud)

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

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

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

das*_*ght 6

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

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

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

例如,当你写这个

unsigned long *ptr = getLongPtr();
unsigned long val = ptr; // Probably an error
Run Code Online (Sandbox Code Playgroud)

几乎可以肯定你在前面错过了一个星号ptr:

unsigned long val = *ptr; // This is what it should be
Run Code Online (Sandbox Code Playgroud)

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

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