我最近写了一些代码,发现自己做了很多c风格的演员表,如下所示:
Client* client = (Client*)GetWindowLong(hWnd, GWL_USERDATA);
Run Code Online (Sandbox Code Playgroud)
我心想; 为什么我们真的需要做这些?
我可以理解为什么在有很多代码的情况下需要这样做,其中编译器可能不会将哪些类型转换为什么类型,例如使用反射时.
但是当从一个long转换为两个类型大小相同的指针时,我不明白为什么编译器不允许我们这样做?
当从一个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.
| 归档时间: |
|
| 查看次数: |
89 次 |
| 最近记录: |