首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C风格显式类型转换的搜索:a= (int)b;

C风格显式类型转换的搜索:a= (int)b;
EN

Stack Overflow用户
提问于 2011-09-28 20:11:26
回答 4查看 202关注 0票数 3

我有一个关于这个诊断的好处的问题。一位用户建议我们在PVS-Studio分析器中实现对C风格的所有显式类型转换的搜索。也就是说,检测这种构造的诊断:

代码语言:javascript
复制
int *x = (int *)y;
float a = float(b);
float c = (float)(d);

它的目的是将所有这些转换替换为它们更安全的版本- reinterpret_cast/static_cast/const_cast。在这样的重构过程中,可以很好地检测到代码中的一些缺陷。

当然,这不是关键错误的检测,如果我们实现这个诊断,它将在客户的特定请求一节中,并且默认情况下是禁用的。

但我甚至怀疑这种诊断的好处。所以我决定问问其他用户:还有没有人需要这个选项来搜索C风格的显式类型转换?有人愿意在他们的代码中执行这种重构吗?

EN

回答 4

Stack Overflow用户

发布于 2011-09-28 20:20:51

一个常见的观点(例如expressed by Stroustrup)是C风格的转换容易隐藏错误。我假设这些视图会促使相当多的人不使用它们,所以我想反C-cast诊断应该会有一些用处。我个人并不介意这样做,因为我无论如何都会避免C风格的强制转换,但是考虑到遗留代码,我会发现这个搜索很有用。

票数 2
EN

Stack Overflow用户

发布于 2011-09-28 20:35:45

我甚至会更进一步,类型转换通常是一件不好的事情,大量使用它们的代码是可疑的。这肯定是C语言的情况,其中可能发生的隐式转换的规则非常有限,并且由语言很好地定义。

由于重载,C++有点复杂,但是仍然不需要太多的显式类型转换。设计应该总是这样的,即只有一条唯一的路径将一种类型转换为另一种类型。

强制转换是不好的,因为如果被强制转换的表达式的类型发生变化,它们很容易隐藏问题。例如,在您的示例中,如果y从指针类型更改为整数类型。但在任何情况下,C++风格的转换都要好得多,无论是因为它们更容易搜索,而且输入起来真的很痛苦,人们自然会避免使用它们:)并尝试完全禁止reinterpret_cast,或者至少它应该是非常罕见的。

票数 0
EN

Stack Overflow用户

发布于 2011-09-28 20:36:03

我理解C++ cast支持C cast的动机(本质上是因为C cast有时是static_cast,有时是reinterpret_cast,会有惊喜的风险),但是...重构已经有效的东西可能会引入甚至意想不到的错误,因为你可能曲解了原始开发人员要做的事情……

除非您正在重新考虑重写逻辑(所以您不是在“逐条语句”地工作,而是在理解整体语义),否则我不会这么做。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7583015

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档