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

时间:2010-05-30 11:32:30

标签: 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);

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

P.S。它是依赖于平台的代码。

1 个答案:

答案 0 :(得分:7)

我想这将是const_cast<ULONG_PTR*>(reinterpret_cast<const ULONG_PTR*>(&info))

从Effective C ++,第3版。 Ed。,Item 27:

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

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

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