【问题标题】:Should I use a C++ reinterpret_cast over a C-style cast?我应该在 C 风格的演员表上使用 C++ reinterpret_cast 吗?
【发布时间】:2011-12-08 06:32:05
【问题描述】:

我有以下模板函数,用于将任何标准类型的数据转储到二进制输出流中。

template<typename T> static void
dump ( const T& v, ostream& o ) {
    o.write ( reinterpret_cast<const char*>(&v), sizeof(T));
}

我也可以使用 C 风格(const char*)来代替 reinterpret_cast。使用 reinterpret_cast 有什么特别的理由吗?我阅读了其他一些不赞成 reinterpret_cast 的帖子。但是上面的用法是合法的,不能用别的代替吧?

【问题讨论】:

  • 我想你知道这样做的后果(结果文件只能由在相同架构上使用相同编译器使用相同选项编译的程序读回)。
  • 有人会因为我这么说而打我,但是如果你想要使用 C 风格的转换,你总是可以留下一个你根本无法做到的通用激进评论错过。也必须一些 方法在 C 中找到您的 consts。 ¯|_(ツ)_|¯ 当然你应该注意危险。

标签: c++ casting reinterpret-cast


【解决方案1】:

C-Style casts 的问题在于它们在底层做了很多事情。详细解释见这里:http://anteru.net/2007/12/18/200/

您应该尝试始终使用 C++ 类型转换,从长远来看会使生活更轻松。在这种情况下,C 风格转换的主要问题是您可以编写(char*)(&amp;v),而使用reinterpret_cast,您需要额外的const_cast,所以它更安全一些。此外,您可以使用正则表达式轻松找到 reinterpret_cast,这对于 C 风格的转换是不可能的。

【讨论】:

  • 对于reinterpret_cast,你甚至不需要一个成熟的正则表达式,一个简单的文本搜索(在大多数编辑器上都很好的“查找”)就足够了:)
  • Args,是的。我开始说你不能对 C 风格的演员进行正则表达式,然后这句话就反过来了;)
  • 想要找到所有演员表吗?
  • 好吧,假设你有一个 Foo* 被破坏的错误(即指向无效的东西)是通过检查你是否将某些东西转换为可能不是 Foo 的 Foo*,要求你找到所有强制转换为 Foo*。
【解决方案2】:

没有区别。在给定的情况下,C 风格的演员表恰恰是一种“重新解释”的演员表。

您应该更喜欢 C++ 风格的强制转换的原因是它们明确地说明了它们正在转换的内容。如有必要,C 风格的强制转换将始终尝试使用最粗略的强制强制转换,而 C++ 风格的强制转换仅在可能的情况下编译:静态强制转换仅在值可转换或指针/引用时成功是兼容的,并且 const-cast 仅在源和目标是彼此的 cv 限定版本时才有效。 reinterpret-cast 明确表示您希望检查底层二进制表示。 (请注意,唯一有效的重新解释转换通常是那些 to void 或 char 指针,除非它们是一些更大的诡计的一部分。)

【讨论】:

  • "请注意,唯一有效的重新解释转换通常是那些指向 void- () 指针的转换" 为什么要转换为 void*
  • 这里不需要reinterpret_caststatic_cast 很好。 (我会喜欢标准的implicit_cast。)
【解决方案3】:

C 风格的铸造是非常非常危险的。因此 C++ 分类根据典型用法将类型转换分为以下类型,

dynamic_cast(expression) - 允许在适当的类层次结构之间进行转换。

const_cast(expression) - 抛弃 const-ness。

static_cast(expression) - 在一定程度上是 C 风格,但仍然尊重类型之间的一些不兼容性并且不允许。

reinterpret_cast(expression) - 如果仍不满足要求,则可用。 C 风格的铸造,但有一个名字。所以在大型代码库中很容易找到它。

注意:- 大多数“reinterpret_cast”可以通过适当的设计消除。换句话说,需要“reinterpret_cast”意味着设计中很可能有问题。

更新: 这应该是最后一个选项,在上述情况下,用法是正确的。现在提到 reinterpret_cast 会给读者一种印象,即作者故意选择不关心类型安全。但是使用 c 风格的转换不会给人那种印象。

【讨论】:

  • 但我想上面代码中使用的 reinterpret_cast 非常简单 - 不符合您的重新设计说明?
  • 正如我所提到的,这应该是最后一个选项,在上述情况下,用法是正确的。现在提到 reinterpret_cast 会给读者一种印象,即作者故意选择不关心类型安全。但是使用 c 风格的转换不会给人那种印象。
【解决方案4】:

reinterpret_cast 在用于替换static_castdynamic_cast 时不受欢迎。鼓励使用它来替换 C 转换。

新的演员表比 C 风格的演员表有好处。一方面,你可以限制你真正想要的演员,另一方面,对新演员进行文本搜索比 C 演员容易得多。

【讨论】:

  • 对新演员进行文本搜索”你多久这样做一次?
  • @curiousguy:我已经做过几次了。我几乎从不关心我从演员表中得到了什么,但我经常关心我采取了一个我碰巧知道涉及演员表操作的特定步骤。我不是在寻找演员表,本身,我正在寻找我碰巧知道使用演员表的其他东西。
猜你喜欢
  • 1970-01-01
  • 2019-03-25
  • 2012-08-14
  • 2014-11-29
  • 2011-04-04
  • 1970-01-01
  • 1970-01-01
  • 2011-06-20
  • 2014-07-10
相关资源
最近更新 更多