阅读错误报告clang 不支持 FENV_ACCESS pragma我遇到过一个comment:
设置舍入模式而不使用#pragma STDC FENV_ACCESS ON
调用未定义的行为。参见 C11 7.6.1/2。 (这个编译指示在 C++ 中不存在,因此 不可用,但这不是我们的错...)
这个pragma真的不存在于C++中吗,渲染<cfenv>
无法使用?我试图在 C++11 标准中搜索它,但实际上根本没有提到它。编译指示是否与函数原型一起从 C 继承?或者实际上不需要它们来避免 UB,因为 C++ 标准没有说明不使用编译指示时未定义的行为(因为根本没有提及编译指示)?
我搜索了2015年标准草案文本,没有发现FENV_ACCESS的出现。http://cppreference.com也无话可说。
然而,http://cplusplus.com确实提到了它(因为它不在标准中,我认为我们必须假设这充其量只是咨询信息):
http://www.cplusplus.com/reference/cfenv/FENV_ACCESS/
引用自 cplusplus.com:(强调我的)
如果设置为 on,程序会通知编译器它可能会访问浮点环境来测试其状态标志(异常)或在默认控制模式以外的控制模式下运行。
如果设置为关闭,编译器可能会执行某些优化,从而破坏这些测试和模式更改,因此在上述情况下访问浮点环境会导致未定义的行为.
默认情况下此编译指示的状态是打开还是关闭取决于编译器设置和库实现。
鉴于令人不安的缺乏清晰度,我希望尽可能避免使用它。
与以往一样,如果使用不可避免,我希望将其封装到一个类中,我可以针对每种架构进行专门化和测试。
然后记录这个类的存在以及如果编译器、环境或库实现升级可能导致的麻烦。
Update:
C++ 标准中非常简短地提到了标头:
§26.3 浮点环境 [cfenv]
...
2 标头定义所有函数、类型和宏,与 C 标准第 7.6 条相同。
Update:
更多信息请参见此处:http://en.cppreference.com/w/cpp/preprocessor/impl
我对此的解读是,编译指示是由 C11 标准定义的,而不是 C++11 标准。因此,在 C++ 程序中的使用是严格实现/未定义的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)