不支持 pragma STDC FENV_ACCESS ON

pragma STDC FENV_ACCESS ON is not supported

提问人:Tomilov Anatoliy 提问时间:11/2/2015 最后编辑:Tomilov Anatoliy 更新时间:11/2/2015 访问量:3150

问:

我试图稍微修改文章中的示例:

#include <iostream>
#include <cfenv>

#pragma STDC FENV_ACCESS ON

int main()
{
    std::feclearexcept(FE_ALL_EXCEPT);
    //int r = std::feraiseexcept(FE_UNDERFLOW | FE_DIVBYZERO);
    double x = 1.0;
    double y = 0.0;
    double result{};
    asm volatile ("fldl %1\n"
                  "fdivl %2\n" : "=%t"(result) : "m"(x), "m"(y) : "memory");
    std::cout << result << std::endl;
    int e = std::fetestexcept(FE_ALL_EXCEPT);
    if (e & FE_DIVBYZERO) {
        std::cout << "division by zero\n";
    }
    if (e & FE_INEXACT) {
        std::cout << "inexact\n";
    }
    if (e & FE_INVALID) {
        std::cout << "invalid\n";
    }
    if (e & FE_UNDERFLOW) {
        std::cout << "underflow\n";
    }
    if (e & FE_OVERFLOW) {
        std::cout << "overflow\n";
    }
    return EXIT_SUCCESS;
}

但我收到一个警告(对于 clang++,但对 G++ 也是如此):

warning: pragma STDC FENV_ACCESS ON is not supported, ignoring pragma [-Wunknown-pragmas]
#pragma STDC FENV_ACCESS ON
             ^
1 warning generated.

另一篇文章报道说,编译指示是对待所谓的C类标准编译指示,但前面提到的文章确实包含代码,它使用了编译指示。

是否允许在 C++ 代码中使用编译指示?C++中有标头。它暗示了这样一个事实,即这个浮点环境可以在 C++ 中使用。但本文将介绍浮点环境的实现依赖性。这是否涉及 C++<cfenv>

C++ 浮点 C++14 编译指示

评论

6赞 Pascal Cuoq 11/2/2015
它在 C 编译器中也不受支持(截至 2015 年)。GCC 有一个 file-scope 选项。查看 stackoverflow.com/questions/24541589/...
3赞 MSalters 11/2/2015
在实践中,请阅读有关 FP 环境访问的编译器文档。标准化相当有限。无论如何,这并不重要:当你写出标准的那一刻,它就停止了应用。asm
1赞 Cubbi 11/26/2015
@Pascal我使用的编译器中的 Cuoq 中,IBM、Oracle 和 HP 都支持 FENV_ACCESS 编译指示,尽管我没有深入测试它(不幸的是,这无关紧要,因为我的代码必须移植到 gcc)

答: 暂无答案