问题描述
这个简单的代码(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
clang
和 gcc
:
- 声明符合附录 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 (将#修改为@)