C++ CPP,WinAPI-WM_创建从lParam获取CREATESTRUCT*的正确方法

C++ CPP,WinAPI-WM_创建从lParam获取CREATESTRUCT*的正确方法,c++,winapi,pointers,casting,struct,C++,Winapi,Pointers,Casting,Struct,Win32 API的某个教程使用此行将lParam参数从主窗口过程中的WM\u CREATE消息转换为CREATESTRUCT*: reinterpret_cast<CREATESTRUCT*>(lParam) // Method 1 这本教程的作者这样做有什么原因吗 而且,我确信有比我更好的方法吗?在这种特殊情况下,这两种结构是等效的。没有未定义的行为——C++标准保证将一个指针重新解释为一个足够宽的整数,而返回结果在同一个指针中。 您可以放心地假设Windows从原始指针创建

Win32 API的某个教程使用此行将
lParam
参数从主窗口过程中的
WM\u CREATE
消息转换为
CREATESTRUCT*

reinterpret_cast<CREATESTRUCT*>(lParam)  // Method 1
这本教程的作者这样做有什么原因吗


而且,我确信有比我更好的方法吗?

在这种特殊情况下,这两种结构是等效的。没有未定义的行为——C++标准保证将一个指针重新解释为一个足够宽的整数,而返回结果在同一个指针中。
您可以放心地假设Windows从原始指针创建了
lParam
值,就像通过
重新解释\u cast

在这种特定情况下,这两种构造是等效的。没有未定义的行为——C++标准保证将一个指针重新解释为一个足够宽的整数,而返回结果在同一个指针中。 您可以放心地假设Windows从原始指针创建了
lParam
值,就像通过
reinterpret\u cast
表单被称为c样式转换一样。使用此选项时,编译器将尝试所有可能的方法将表达式(lParam-此处)转换为类型(CREATESTRUCT*-此处)

让我解释一下所有可能的铸造方法

  • 从“const /易失性T”到C++中的T-程序员使用<强> const铸造< <强> < /LI>来选择这种方式。
  • 从“T”到“R”的铸造,其中T和R是相关的。如INT/CHAR、CAR、车辆等。在C++中,程序员使用<强> STATICE-CAST<<强> > /LI>来选择这种方式。
  • 从“T”转换到“R”,其中T和R是相关的,并进行运行时检查。例如,T=Vehicle和R=Car,从T类型对象到R类型对象的转换在静态上是有效的,但实际上(在运行时)编译器(通过隐藏代码)必须检查被类型转换的对象是否确实是Car或Car的衍生物。-在C++中,程序员使用<强>动态>强制> > < /LI>来选择这种方式。
  • 从“U”到“V”的转换,其中U和V是不相关的。-在C++中,程序员使用<强> ReRealtType < <强> > /LI>选择这种方法。

    如果C++程序员使用C++风格的编译器,他告诉编译器尝试所有可能的方法来转换/感知表达式到/作为特定类型。 c风格强制转换之所以危险,唯一的原因是程序员的真实意图没有正确地传达给编译器和正在阅读代码的其他程序员。有时,程序员可能只意味着静态转换,而不是重新解释转换,但使用c样式转换会在运行时导致错误,这可能在编译时被捕获。因为如果程序员在不相关的类型上使用静态类型转换,就会发生编译器错误

    用户定义的强制转换操作符会对某些行为产生更大的影响(尤其是静态强制转换),但不会改变基本原理。

    “(CREATESTRUCT*)lParam”表单称为c样式强制转换。使用此选项时,编译器将尝试所有可能的方法将表达式(lParam-此处)转换为类型(CREATESTRUCT*-此处)

    让我解释一下所有可能的铸造方法

  • 从“const /易失性T”到C++中的T-程序员使用<强> const铸造< <强> < /LI>来选择这种方式。
  • 从“T”到“R”的铸造,其中T和R是相关的。如INT/CHAR、CAR、车辆等。在C++中,程序员使用<强> STATICE-CAST<<强> > /LI>来选择这种方式。
  • 从“T”转换到“R”,其中T和R是相关的,并进行运行时检查。例如,T=Vehicle和R=Car,从T类型对象到R类型对象的转换在静态上是有效的,但实际上(在运行时)编译器(通过隐藏代码)必须检查被类型转换的对象是否确实是Car或Car的衍生物。-在C++中,程序员使用<强>动态>强制> > < /LI>来选择这种方式。
  • 从“U”到“V”的转换,其中U和V是不相关的。-在C++中,程序员使用<强> ReRealtType < <强> > /LI>选择这种方法。

    如果C++程序员使用C++风格的编译器,他告诉编译器尝试所有可能的方法来转换/感知表达式到/作为特定类型。 c风格强制转换之所以危险,唯一的原因是程序员的真实意图没有正确地传达给编译器和正在阅读代码的其他程序员。有时,程序员可能只意味着静态转换,而不是重新解释转换,但使用c样式转换会在运行时导致错误,这可能在编译时被捕获。因为如果程序员在不相关的类型上使用静态类型转换,就会发生编译器错误


    用户定义的强制转换操作符对某些行为的影响更大(尤其是静态强制转换),但不会改变基本原理。

    此外,
    (CREATESTRUCT*)
    语法(又名C样式强制转换)说“使用
    重新解释强制转换
    静态强制转换
    ,无论哪种方式有效”,因此在功能上,它们是相同的,只需更少的错误检查。+1好的,谢谢各位,这是一个很大的帮助@西蒙里克特-你有这方面的链接吗?快速浏览了CREATESTRUCT文档,但没有任何细节。如果有太多麻烦,不用担心,只是好奇。@Steve,请看。
    (CREATESTRUCT*)
    语法(又名C风格的强制转换)说“使用
    重新解释强制转换
    静态强制转换
    ,无论哪种方式有效”,所以在功能上,它们是相同的,只是错误检查较少。+1好的,谢谢各位,这是一个很大的帮助@西蒙里克特-你有这方面的链接吗?快速浏览了CREATESTRUCT文档,但没有任何细节。如果有太多的麻烦,不用担心,只是好奇。@Steve,看。要知道哪种演员使用,你应该去看看,我总是在我对演员有疑问的时候读它。在你的例子中,我认为静态_类型是最干净的答案,因为“C类型”可以转化为re类型
    (CREATESTRUCT*) lParam // Method 2