【问题标题】:reinterpret_cast or C Style type casting [duplicate]reinterpret_cast 或 C 风格类型转换 [重复]
【发布时间】:2016-01-15 06:53:47
【问题描述】:

应该更喜欢 reinterpret_cast 而不是 C 风格的转换。请解释一下。

如果必须在 reinterpret_castc 风格转换 之间进行选择,应该首选哪一个

【问题讨论】:

  • 考虑删除标签 c 并添加标签 c++。
  • 这就像试图取两害相权取其轻。如果你需要它(例如调用istream::read),那么你应该更喜欢reinterpret_cast,但在几乎所有其他情况下,我会说如果你需要做这样的演员,你正在做有事吗。这样的选角绝对是code smell

标签: c++ casting reinterpret-cast


【解决方案1】:

演员表应该很少使用,而且要谨慎使用,如果你在滥用系统,如果你写的话更容易被发现:

char *x = const_cast<char *>(some_const_char_pointer_expression);

如果你用以下方式伪装它:

char *x = (char *)some_const_char_pointer_expression;

因此,请使用明确、受控、冗长的符号,因为它鼓励您避免强制转换,并在必须使用强制强制转换时使用正确、精确的强制转换。

【讨论】:

  • 您可能会觉得这很有趣:usenix.org/system/files/conference/usenixsecurity15/… 这是关于“不良铸造”检测工具 [CaVer]。除了论文中概述的基本功能外,有趣的是看看 CaVer 的 RTTI 类数据的实现[由它在内部使用]是否可以调整,以便它可以用作传统的 [更快] 替代品[基于字符串] RTTI 信息
【解决方案2】:

C 风格的演员表更普遍。它从const_caststatic_castconst_caststatic_castdynamic_cast 中“选择”,然后是dynamic_castconst_cast,最后是reinterpret_castreinterpret_cast 和@98765433。因此,如您所见,c-cast 和reinterpret_cast 之间存在很大差异,因为 C-cast 转换首先使用静态和动态转换。

如果你用 C++ 编写,你应该更喜欢上面的转换而不是 C 风格的转换。它们更明确。但是 C 风格的演员表并不是一种非常非常非常糟糕的风格。

【讨论】:

  • C 风格的强制转换可以是“非常非常糟糕”,因为它可以在没有警告的情况下抛弃 const 正确性。
  • @JoachimPileborg 编辑了我的答案,谢谢。
猜你喜欢
  • 1970-01-01
  • 2013-05-16
  • 2011-03-17
  • 1970-01-01
  • 2013-02-13
  • 1970-01-01
  • 2017-02-03
  • 1970-01-01
相关资源
最近更新 更多