gpt4 book ai didi

c++ - 将 DWORD_PTR 转换为类,反之亦然,无需 c 风格转换

转载 作者:行者123 更新时间:2023-11-27 22:48:25 25 4
gpt4 key购买 nike

根据 Herb Sutter 的 C++ Coding Standards: 101 Rules, Guidelines, and Best Practices程序员应该避免 C 风格的转换:

C-style casts have different (and often dangerous) semantics depending on context, all disguised behind a single syntax. Replacing C-style casts with C++-style casts helps guard against unexpected errors

我正在尝试将指针 p_ctrl 传递给 WinAPI 回调函数,为此我想使用回调函数的 DWORD_PTR 参数(下面的示例有效,但在注释处包含 C 样式转换):

WndCtrls* WndCtrls::Button ( WndCtrls* const p_ctrl, HWND hwnd, RECT const &rc )
{
p_ctrl->ctrl = CreateWindowEx (
0,
L"BUTTON",
p_ctrl->w_classNameButton.c_str (),
WS_VISIBLE | WS_CHILD | BS_OWNERDRAW,
rc.left,
rc.top,
rc.right,
rc.bottom,
hwnd,
0,
(HINSTANCE)GetWindowLongPtr ( hwnd, GWL_HINSTANCE ), // Problematic C-style cast for which I already know workaround
p_ctrl
);
SetWindowSubclass ( p_ctrl->ctrl, WndCtrls::CtrlProc, 0, (DWORD_PTR)p_ctrl ) ) // C-style cast

return p_ctrl;
}

LRESULT CALLBACK WndCtrls::CtrlProc ( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData )
{
WndCtrls* const p_ctrl = (WndCtrls*)dwRefData; // Problematic C-style cast
switch ( message )
{
...
}
return DefSubclassProc ( hwnd, message, wParam, lParam );
}

我已经尝试过动态转换,但这会给我带来错误。 reinterpret_cast 根本不应该使用(根据 Sutter 的说法)。

请问有没有办法使用 C++ 提供的函数来进行这些转换?

最佳答案

Sutter 的建议就是:忠告。它们不是硬性规定;它们只是鼓励您编写更安全、更健壮的代码的建议。

这是建议不起作用的情况之一。

在许多地方,Windows API 需要能够传递可能是也可能不是指针的数据。因此,它使用指针大小的整数,使用 C 风格的转换(请记住 Windows API 主要是基于 C 的)将整数转换为指针。这安全的,因为文档要求它是:如果你给 Windows 一个垃圾指针值,你就违反了该函数的规则!

指针大小整数的标准 C/C++ 名称是 intptr_t (签名)和uintptr_t (未签名)。但是,Windows 早于 C99 和 C++11(当它们被引入时),因此它使用自己的名称:LONG_PTR (签名)和DWORD_PTRULONG_PTR (未签名)。此外,WPARAM , LPARAM , 和 LRESULT也是指针大小的,因为窗口消息通常需要处理指针。

所以继续使用 C 风格的转换或 reinterpret_cast<> ,你喜欢哪一个。其他类型转换不起作用,因为您需要将整数解释为指针,而其他类型转换不允许您这样做。

你可能无论如何都需要这些,因为还有其他地方,因为 Windows API 不仅需要在 C 中,而且还需要从其他语言中使用,子类被替换为具有结构的对象作为第一个派生派生结构的元素。这在 WM_NOTIFY 中最为明显。消息,其中所有可能的通知结构都使用 NMHDR 执行此操作.请记住这一点。

关于c++ - 将 DWORD_PTR 转换为类,反之亦然,无需 c 风格转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40568503/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com