我尝试稍微修改the article中的示例:
#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.
Another article报告说,pragma是对待所谓的 C标准编译指示的类,但前面提到的文章确实包含了使用pragma的代码。
是否允许在 C ++ 代码中使用pragma? C ++ 中有<cfenv>
标头。它暗示了这个Floating-point environment可用于 C ++ 。但this article报告了浮点环境的实现依赖性。这涉及 C ++ 吗?