重新配置C ++代码以处理`警告:无序修改和访问参数`

时间:2013-11-29 15:22:21

标签: c++ refactoring warnings

我正在编译的库中有几行代码,它们在clang(OSX)下抛出警告,如下所示:

warning: unsequenced modification and access to 'tmp' [-Wunsequenced]
    float tmp, fCosSqr = (tmp = cos(m_angle)) * tmp;
                              ^                 ~~~

这行代码看起来非常讨厌,我发现很难确定发生了什么。

据我所知,fCosSqr的最终值应为cos(m_angle)^2tmp的最终值应为cos(m_angle)(尽管事实上,tmp不会在程序的其他任何地方使用。)

可能提供了警告,因为如果分配不按顺序进行,则可以使用tmp的未初始化值代替cos(m_angle)


我可以按如下方式重写代码行:

float tmp = cos(m_angle), fCosSqr = tmp * tmp;

或者像这样:

float fCosSqr = cos(m_angle) * cos(m_angle);

为什么代码编写得如此?它应该提供某种速度增益吗?

1 个答案:

答案 0 :(得分:3)

没有充分的理由按原样编写代码。只要纠正它,并向首先写下它的人发出严厉的抱怨。这一点并确保审查来自同一个开发人员的任何类似的破坏代码,因为该库可能充满了像这样的错误。


请注意,您提供的第二种方法可能会产生一些额外费用。除非编译器能够证明cos是纯函数(即具有相同参数的多个请求将产生相同的精确结果),否则它将不得不两次调用cos。添加临时保存中间值是好的,在同一行中定义多个变量并不是那么好,原始代码中的未定义行为是一个可怕的选择。