如何处理警告C4177:#pragma'float_control'只应在全局范围或命名空间范围内使用

时间:2018-02-21 00:10:25

标签: c++ warnings

在我的c ++代码(VS2013)中可能从VC6迁移,有一个警告C4177:#pragma'float_control'应该只在全局范围或命名空间范围内使用 代码如下:

    bool ClassNameHere::FunctionNameHere(Process::FileInfo *fileInfo, RBF &File, PaveConfig &cfg)
    {
        //some code here

    #pragma float_control( strict, on, push )

        // Calculate sample interval.
        double dResolution = 1000000 / odo.dOdoFactor;   // (1.0 / odo.dOdoFactor) * 1000000.0;

        double dPulsesPerElevInterval = (DWORD)cfg.fSampleInterval / dResolution;
        // Small fix for test mode surveys
        if (odo.dOdoFactor != 1)
            dPulsesPerElevInterval = DWORD(1.0 + dPulsesPerElevInterval);

        //some code here
        //....
        //...
        dElevInterval = dElevInterval / 1000.0;
        dAccelInterval = dAccelInterval / 1000.0;
    #pragma float_control(pop)
        return true;
    }

有人知道如何处理警告吗?如果我只是将这些#pragma float_control移出函数,并将它们放入调用全局范围。我应该在哪里放?或者还有其他解决方案吗? 感谢,

1 个答案:

答案 0 :(得分:2)

The documentation非常可怕,如果忽略警告会发生什么,

  

在当前作用域之后遇到全局作用域之前,pragma无效。

所以看起来你唯一的选择是将pragma移到函数之外。

如果你不关心some code here被包含在内,那么请先推动功能,然后再弹出。

#pragma float_control( strict, on, push )
bool ClassNameHere::FunctionNameHere(Process::FileInfo *fileInfo, RBF &File, PaveConfig &cfg)
{
    //some code here
    // code we care about here
}
#pragma float_control(pop)

如果你关心some code here被包含在内,请创建另一个包含push和pop之间当前代码的函数,用push和pop包围这个新函数,然后从FunctionNameHere调用新函数。像

这样的东西
#pragma float_control( strict, on, push )
bool ClassNameHere::HelperForFunctionNameHere (Process::FileInfo *fileInfo, RBF &File, PaveConfig &cfg)
{
    // code we care about here
}
#pragma float_control(pop)

bool ClassNameHere::FunctionNameHere(Process::FileInfo *fileInfo, RBF &File, PaveConfig &cfg)
{
    //some code here
    return HelperForFunctionNameHere(fileInfo, File);
}