Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对C+感到困惑+;铸造 我一直在阅读关于C++的很多内容,我开始感到困惑,因为我一直使用C风格的铸件。 我已经知道C++中应该避免C样式的注记,并且RealTytPress非常危险,并且在有选择的时候不应该使用。与不使用reinterpret_cast相反,我在MSDN的示例代码中多次看到它的使用。这让我问了我的第一个问题,什么时候可以使用reinterpret_cast_C++_Casting - Fatal编程技术网

对C+感到困惑+;铸造 我一直在阅读关于C++的很多内容,我开始感到困惑,因为我一直使用C风格的铸件。 我已经知道C++中应该避免C样式的注记,并且RealTytPress非常危险,并且在有选择的时候不应该使用。与不使用reinterpret_cast相反,我在MSDN的示例代码中多次看到它的使用。这让我问了我的第一个问题,什么时候可以使用reinterpret_cast

对C+感到困惑+;铸造 我一直在阅读关于C++的很多内容,我开始感到困惑,因为我一直使用C风格的铸件。 我已经知道C++中应该避免C样式的注记,并且RealTytPress非常危险,并且在有选择的时候不应该使用。与不使用reinterpret_cast相反,我在MSDN的示例代码中多次看到它的使用。这让我问了我的第一个问题,什么时候可以使用reinterpret_cast,c++,casting,C++,Casting,例如: LRESULT CALLBACK WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { switch (Msg) { case WM_CREATE: { LPCREATESTRUCT lpCreateStruct = reinterpret_cast<LPCREATESTRUCT>(lParam); return 0;

例如:

LRESULT CALLBACK WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
   switch (Msg)
   {
      case WM_CREATE:
      {
          LPCREATESTRUCT lpCreateStruct = reinterpret_cast<LPCREATESTRUCT>(lParam); 
          return 0;
      }
   }

   ...
}
LRESULT回调WndProc(HWND HWND,UINT Msg,WPARAM WPARAM,LPARAM LPARAM)
{
开关(Msg)
{
案例WM_创建:
{
LPCREATESTRUCT LPCREATESTRUCT=reinterpret_cast(LPRAM);
返回0;
}
}
...
}
如果这不正常,那么如何仅使用静态、动态和/或常量转换将LPARAM值转换为指针


另外:如果reinterpret\u cast不可移植,我将如何将其重写为可移植的(为了良好的实践)

如果您知道指针最初是目标类型,则可以使用reinterpret\u cast。任何其他用途都是利用依赖于实现的行为,尽管在许多情况下这是必要和有用的,例如将指向结构的指针转换为指向字节的指针,以便可以对其进行序列化


它被认为是危险的,因为它在编译时或运行时都不进行检查。如果你犯了一个错误,它可能也将崩溃,燃烧得很厉害,并且很难调试。实际上,您是在告诉编译器“我比您更清楚这实际上是什么,所以只需编译代码,让我担心后果。”

您在MSDN上看到它的原因是因为Win32 API是CAPI,但人们坚持在C++中给出示例


当您编写与其他库接口的代码时,Reinterpret cast就可以了。在你自己的应用程序中应该避免。

< P>不要忽视MSDN,但是MSDN不是进行正确C++编码的最佳地方。 使用reinterpret_cast的一个原因是在向不透明数据类型进行转换或从不透明数据类型进行转换时。reinterpret_cast不是“危险的”,只是它很容易出错并导致代码出现问题,这就是为什么应该避免它

<> P> C++风格转换的原因是STATICE-CAST是类型化的,所有的铸造时间更容易搜索。
程序员[错误地]经常使用强制转换来“消除编译器警告”,例如从无符号整数转换为有符号整数,或从32位整数转换为8位整数

本质上
reinterpret_cast
对于C结构和基本类型来说是“安全的”(有一些明显的错误,比如将
int
转换为指针并返回,这在ILP32架构上有效,但在LP64架构上中断)。C结构中没有任何内容,除了可能的对齐填充之外,您没有声明


<>代码> RealTytRask对于C++多态类型来说是不安全的,因为编译器将数据项插入到您的类中,比如“强>指向虚拟表的指针<强> >和强>指向虚拟基类< /强>的指针。其他C++的C++在调整时,注意从指针到基类到派生类的指针向下调整,<代码> RealTytRask和C样式的CaseNo。

< P>这是一个用C++编写的Windows平台SDK,一个C API的例子。窗口过程只有WPARAM和LPARAM参数,如果需要通过窗口消息传递指向结构的指针,则必须强制转换。在我看来,这是对reinterpret_cast的完全可以接受的使用。你不能避免一个演员阵容,因为你写的SDK不是你的代码,不是为C++设计的,更不用说类型安全,而是需要用C绑定来提供通用的参数类型。 这里的reinterpret_cast是一面旗帜,让你知道你需要小心,但这不是无论如何都要避免的


另一方面,如果您控制了代码的两个方面,即API和使用者,则最好制作一个类型安全的API,并且不需要使用者执行强制转换来正确使用它。

这可能是非常旧的代码库。+1。MSDN充满了MS ISM。Scott Meyers和萨特的好书(虽然他现在在MS,他是一个优秀的作家,有很多关于编写优秀C++的伟大建议)是巩固人们对良好C++实践的理解的更好地方。@ Matt Curtis,我发现MSDN更令人讨厌的部分是MSISM应用不一致。质量因其示例而异。一般来说,你不应该复制粘贴他们的例子;它可能会给你一个粗略的想法,但你应该将这些想法调整到你正在处理的项目中使用的任何编码风格。以这种方式序列化结构是一个坏主意(即使经常这样做),但这是另一个问题的主题。