C++ CPP,WinAPI-WM_创建从lParam获取CREATESTRUCT*的正确方法
Win32 API的某个教程使用此行将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从原始指针创建
lParam
参数从主窗口过程中的WM\u CREATE
消息转换为CREATESTRUCT*
:
reinterpret_cast<CREATESTRUCT*>(lParam) // Method 1
这本教程的作者这样做有什么原因吗
而且,我确信有比我更好的方法吗?在这种特殊情况下,这两种结构是等效的。没有未定义的行为——C++标准保证将一个指针重新解释为一个足够宽的整数,而返回结果在同一个指针中。
您可以放心地假设Windows从原始指针创建了
lParam
值,就像通过重新解释\u cast
在这种特定情况下,这两种构造是等效的。没有未定义的行为——C++标准保证将一个指针重新解释为一个足够宽的整数,而返回结果在同一个指针中。
您可以放心地假设Windows从原始指针创建了lParam
值,就像通过reinterpret\u cast
(如果C++程序员使用C++风格的编译器,他告诉编译器尝试所有可能的方法来转换/感知表达式到/作为特定类型。 c风格强制转换之所以危险,唯一的原因是程序员的真实意图没有正确地传达给编译器和正在阅读代码的其他程序员。有时,程序员可能只意味着静态转换,而不是重新解释转换,但使用c样式转换会在运行时导致错误,这可能在编译时被捕获。因为如果程序员在不相关的类型上使用静态类型转换,就会发生编译器错误
用户定义的强制转换操作符会对某些行为产生更大的影响(尤其是静态强制转换),但不会改变基本原理。“(CREATESTRUCT*)lParam”表单称为c样式强制转换。使用此选项时,编译器将尝试所有可能的方法将表达式(lParam-此处)转换为类型(CREATESTRUCT*-此处) 让我解释一下所有可能的铸造方法如果C++程序员使用C++风格的编译器,他告诉编译器尝试所有可能的方法来转换/感知表达式到/作为特定类型。 c风格强制转换之所以危险,唯一的原因是程序员的真实意图没有正确地传达给编译器和正在阅读代码的其他程序员。有时,程序员可能只意味着静态转换,而不是重新解释转换,但使用c样式转换会在运行时导致错误,这可能在编译时被捕获。因为如果程序员在不相关的类型上使用静态类型转换,就会发生编译器错误
用户定义的强制转换操作符对某些行为的影响更大(尤其是静态强制转换),但不会改变基本原理。此外,
(CREATESTRUCT*)
语法(又名C样式强制转换)说“使用重新解释强制转换
或静态强制转换
,无论哪种方式有效”,因此在功能上,它们是相同的,只需更少的错误检查。+1好的,谢谢各位,这是一个很大的帮助@西蒙里克特-你有这方面的链接吗?快速浏览了CREATESTRUCT文档,但没有任何细节。如果有太多麻烦,不用担心,只是好奇。@Steve,请看。(CREATESTRUCT*)
语法(又名C风格的强制转换)说“使用重新解释强制转换
或静态强制转换
,无论哪种方式有效”,所以在功能上,它们是相同的,只是错误检查较少。+1好的,谢谢各位,这是一个很大的帮助@西蒙里克特-你有这方面的链接吗?快速浏览了CREATESTRUCT文档,但没有任何细节。如果有太多的麻烦,不用担心,只是好奇。@Steve,看。要知道哪种演员使用,你应该去看看,我总是在我对演员有疑问的时候读它。在你的例子中,我认为静态_类型是最干净的答案,因为“C类型”可以转化为re类型
(CREATESTRUCT*) lParam // Method 2