重新配置C++代码以处理“警告:未按顺序修改和访问参数”

Reconfiguring C++ code to deal with `warning: unsequenced modification and access to parameter`

本文关键字:顺序 修改 参数 访问 警告 配置 新配置 C++ 处理 代码      更新时间:2023-10-16

我正在编译的库中有几行代码在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);

为什么代码一直按原样编写?它应该提供某种速度增益吗?

没有充分的理由按原样编写代码。只要纠正它,并向最初写它的人发出严厉的抱怨。并确保查看来自同一开发人员的任何类似的损坏代码,因为库中可能充满了类似的错误。


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