代码之家  ›  专栏  ›  技术社区  ›  Penny

如何处理警告C4177:#pragma“float\u control”只能在全局作用域或命名空间作用域中使用

  •  1
  • Penny  · 技术社区  · 8 年前

    在可能从VC6迁移的c++代码(VS2013)中,有一个警告C4177:#pragma“float\u 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\u控件移出函数,并将它们放入所谓的全局范围。我应该把它放在哪里?还是有其他解决方案? 谢谢

    1 回复  |  直到 8 年前
        1
  •  2
  •   user4581301    8 年前

    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)
    

    如果你真的在乎 这里有一些代码 包括在内,创建另一个包含当前位于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);
    }