【问题标题】:C++: Is it safe to cast from wchar_t* to unsigned short*?C++:从 wchar_t* 转换为 unsigned short* 是否安全?
【发布时间】:2018-02-28 09:33:46
【问题描述】:

C++:从 wchar_t* 转换为 unsigned short* 是否安全?

因为我使用的是 MSXML2 的 SAXReader,所以我需要传递 unsigned short* 它的一些方法。我需要传递的值是 wchar_t,所以执行此转换是否安全?

【问题讨论】:

  • 一般来说,没有。具体来说,如果sizeof (wchar_t) 等于sizeof (unsigned short),您可能会侥幸成功,但这并不能保证。
  • 一些系统将 wchar_t 定义为 unsigned int。
  • @freim:这在 C++ 中是非法的。 wchar_t 是一个独特的类型。 (与 std::size_t 相反,它 可以 是 unsigned int 的 typedef。)
  • @MSalters - 我不够清楚,抱歉。我想说的是,在某些系统范围内 char 占用 4 个字节。因此,将 wchar_t* 转换为 unsigned short* 是不安全的,即使编译器允许这种转换。

标签: c++ casting saxparser


【解决方案1】:

一般来说,演员表是不安全的,因为严格的别名规则禁止它。

但是,如果 wchar_ttypedef 对应于 unsigned short,您就可以逃脱惩罚。如果是的话,你可以在编译时使用static_assert,基于

std::is_same<whar_t, unsigned short>::value

请进一步注意,尽管这样的实现依赖于您的编译器未正确实现标准:形式上,wchar_t 与整数类型之一具有相同的大小、符号和对齐方式,但它是一种不同的类型。”因此typedef 不符合要求,值断言应该总是失败。

参考:http://en.cppreference.com/w/cpp/language/types

【讨论】:

  • cppreference says: "[wchar_t] 具有与其中一种整数类型相同的大小、符号和对齐方式,但它是一种不同的类型。" -- 所以 typedef 不符合要求。虽然 MSVC 确实有这个选项,但我认为我不需要详细说明;)
  • @Quentin:删掉了那条评论并在维基上找到了答案。
  • 严格的别名规则根本不禁止它,因为这里 OP 试图通过 char 指针访问内存位置!标准是明确的here,指出如果 T2(访问 wchar_t 数据的指针类型)是字符类型(char、signed char 或 unsigned字符)。
猜你喜欢
  • 2011-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多