CPP,Winapi -WM_Create从lparam获得createstruct*的正确方法
CPP, WinAPI - WM_CREATE proper way to get CREATESTRUCT* from lParam
Win32 API的某个教程使用此行将lParam
参数从主窗口过程中的WM_CREATE
消息转换为CREATESTRUCT*
:
reinterpret_cast<CREATESTRUCT*>(lParam) // Method 1
我在其他地方读到reinterpret_cast
是危险的,导致行为不确定,闪电和其他。
我使用了更常规的演员,编译器没有抱怨:
(CREATESTRUCT*) lParam // Method 2
教程的作者是否有这样的理由?
,我确定有比我更好的方法吗?
在这种特殊情况下,这两种构造都是等效的。没有不确定的行为 - C 标准保证重新诠释指针指向足够宽的整数并返回导致相同的指针。
您可以安全地假设Windows从原始指针中创建了lParam
值,就好像reinterpret_cast
。
"(createstruct*)lparam" 表单称为c风格。使用此功能时,编译器将尝试所有可能的方法将表达式(lparam-此处)转换为类型(createstruct* - 在此)。
让我解释所有可能的铸造方法,
- 从" const/volatile t"铸造到t-在C 中,程序员使用 const_cast 选择此方式选择。
- 从" t"到" r",其中t和r是相关的。例如。像int/char,汽车/车辆等 - 在C 中,程序员选择使用 static_cast 的铸造方式。
- 将t和r与运行时检查相关的" t"到" r"。例如。t =车辆和r =汽车,从t类型对象转换为r类型对象在静态上是有效的,但实际上(在运行时)编译器(通过隐藏的代码)必须检查被类型铸造的对象是否确实是汽车还是衍生物汽车。 - 在C 中,程序员选择使用 dynamic_cast 的铸造方式。
- 从" u"到" v",其中u和v是无关的。 - 在C 中,程序员选择使用 reinterpret_cast 的铸造方式。
如果程序员在C 中使用C风格的铸件,他告诉编译器尝试所有可能的方法将表达式转换为/将表达式转换为/作为特定类型。
C风格演员是危险的唯一原因是,程序员的真正意图未正确传达给编译器和将要阅读代码的程序员。有时,程序员可能只意味着static_cast而不是retinterpret_cast,而是使用C风格的铸件会导致运行时的错误,这可能在编译时被捕获。因为如果程序员在无关类型上使用static_cast,则会发生编译器错误。
和用户定义的铸造操作员会影响一些行为(尤其是static_cast),但不会更改基本面。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 使用std::函数映射对象方法
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- C++从另一个类访问公共静态向量的正确方法是什么
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 没有为自己的结构调用列表推回方法
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 在类定义之后定义一个私有方法
- 枚举环境变量的惯用C++14/C++17方法
- CPP,Winapi -WM_Create从lparam获得createstruct*的正确方法