不支持 #pragma STDC FENV_ACCESS ON 如何影响 __STDC_IEC_559__ 和 __STDC__?

问题描述

这个简单的代码(t217.c):

#include <stdio.h>
#include <fenv.h>
#include <float.h>

#pragma STDC FENV_ACCESS ON

int main( void )
{
    feclearexcept( FE_ALL_EXCEPT );
    ( void )( FLT_MAX * FLT_MAX );
    if  ( fetestexcept( FE_OVERFLOW ) )
    {
        return 0;
    }
    printf("error: no FE_OVERFLOW is raised\n");
    return 1;
}

使用 clang 编译并执行:

$ clang t217.c -std=c11 -ffp-model=strict -Wall -Wextra -pedantic -lm && ./a.out
t217.c:5:14: warning: pragma STDC FENV_ACCESS ON is not supported,ignoring pragma [-WunkNown-pragmas]
#pragma STDC FENV_ACCESS ON
             ^
1 warning generated.

导致:

<nothing>

在使用 gcc 编译并执行时:

$ gcc t217.c -std=c11 -Wall -Wextra -pedantic -lm && ./a.out
t217.c:5: warning: ignoring ‘#pragma STDC FENV_ACCESS’ [-WunkNown-pragmas]
    5 | #pragma STDC FENV_ACCESS ON
      | 

导致:

error: no FE_OVERFLOW is raised

clanggcc

  • 声明符合附录 F 中的规范(__STDC_IEC_559__1
  • 可能(请参阅 UPD)声明符合的实现(__STDC__1__STDC_VERSION__201112
  • 不支持 #pragma STDC FENV_ACCESS ON(产生/发出诊断消息)

由于 error: no FE_OVERFLOW is raised 的存在,我们发现附件 F 中的某些规范已被违反。

注意:以下是来自 C11(F.9.1 全局转换)的示例:

#include <fenv.h>
#pragma STDC FENV_ACCESS ON
void f(double x)
{
    /* ... */
    for (i = 0; i < n; i++) x + 1;
    /* ... */
}

评论

x + 1 可能会引发浮点异常,因此无法删除

问题:既然不支持 #pragma STDC FENV_ACCESS ON 可能会导致违反 Annex F,那么这种不支持__STDC_IEC_559__ 有何影响? IE。这种实现是否应该避免将 __STDC_IEC_559__ 定义为 1

额外的问题:不支持 #pragma STDC FENV_ACCESS ON 如何影响 __STDC__? IE。 C 标准是否允许将 __STDC__1 定义为“并非支持所有功能”的实现?

工具版本:

$ clang --version
Ubuntu clang version 11.0.0-2~ubuntu20.04.1
Target: x86_64-pc-linux-gnu

$ gcc --version
gcc (Ubuntu 10.2.0-5ubuntu1~20.04) 10.2.0
copyright (C) 2020 Free Software Foundation,Inc.

更新。是的,__STDC__ is 1 并不意味着符合实施。这意味着符合的实现或不符合的实现,它定义了 __STDC__1

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)