如何在C++中正确地转换结构

dru*_*sta 2 c++ casting

请考虑以下代码摘录:

typedef struct tagTHREADNAME_INFO {
    DWORD dwType;
    LPCTSTR szName;
    DWORD dwThreadID;
    DWORD dwFlags;
} THREADNAME_INFO;

const THREADNAME_INFO info = { 0x1000, threadName, CurrentId(), 0};

::RaiseException(kVCThreadNameException, 0,
    sizeof(info) / sizeof(ULONG_PTR),
    (ULONG_PTR*)&info);
Run Code Online (Sandbox Code Playgroud)

如何使用C++样式转换正确地转换为ULONG_PTR*?

ps它是平台相关的代码.

Pét*_*rök 7

我猜是的const_cast<ULONG_PTR*>(reinterpret_cast<const ULONG_PTR*>(&info)).

从Effective C++,第3版.编辑,第27项:

  • const_cast通常用于抛弃对象的常量.它是唯一能够做到这一点的C++风格的演员.
  • reinterpret_cast适用于产生依赖于实现的(即,不可移植的)结果的低级转换,例如,转换指向int的指针.在低级代码之外,此类强制转换应该很少见.

为了完整起见,剩下的两个C++演员是:

  • dynamic_cast主要用于执行"安全向下转换",即确定对象是否属于继承层次结构中的特定类型.它是唯一使用旧式语法无法执行的强制转换.它也是唯一可能具有显着运行时成本的强制转换.
  • static_cast可用于强制隐式转换(例如,非const对象到const对象(如第3项),intto double等).它也可用于执行许多此类转换的反转(例如,void*指向类型指针的指针,指向指向派生的指针),尽管它不能const转换为非const对象.(只能const_cast这样做.)