FENV_ACCESS pragma 是否存在于 C++11 及更高版本中?
Does FENV_ACCESS pragma exist in C++11 and higher?
正在阅读 clang not supporting FENV_ACCESS pragma I've come across a comment 的错误报告:
Setting the rounding mode without using #pragma STDC FENV_ACCESS ON
invokes undefined behavior. See C11 7.6.1/2. (This pragma does not exist in C++, so <cfenv> is unusable, but that's not our fault...)
这个 pragma 真的不存在于 C++ 中,导致 <cfenv>
无法使用吗?我试图在 C++11 标准中搜索它,但实际上根本没有提到它。编译指示是否与函数原型一起从 C 继承?或者它们实际上不需要避免 UB,因为 C++ 标准没有说明在未使用 pragma 时未定义的行为(由于根本没有提及 pragma)?
我搜索了 2015 年标准草案文本,没有发现 FENV_ACCESS。 http://cppreference.com也一无所知。
但是,http://cplusplus.com 确实提到了它(因为它不在标准中,我认为我们必须假设这充其量只是建议信息):
http://www.cplusplus.com/reference/cfenv/FENV_ACCESS/
引自cplusplus.com:(强调我的)
If set to on, the program informs the compiler that it might access the floating-point environment to test its status flags (exceptions) or run under control modes other than the one by default.
If set to off, the compiler may perform certain optimizations that can subvert these tests and mode changes, and thus accessing the floating-point environment in the cases described above, causes undefined behavior.
Whether the state of this pragma by default is on or off depends on the compiler settings and library implementation.
鉴于令人不安的不明确性,我希望尽可能避免使用它。
一如既往,如果使用是不可避免的,我想将它封装到一个 class 中,我可以专门针对每个架构进行测试。
然后记录这个 class 的存在以及如果编译器、环境或库实现升级可能导致的麻烦。
更新:
c++标准中对header有一个非常简短的提及:
§ 26.3 The floating-point environment [cfenv]
...
2 The header defines all functions, types, and macros the same as Clause 7.6 of the C standard.
更新:
这里有更多信息:http://en.cppreference.com/w/cpp/preprocessor/impl
我的理解是编译指示是由 C11 标准定义的,而不是 C++11 标准。因此在 C++ 程序中使用严格 implementation/un-defined.
正在阅读 clang not supporting FENV_ACCESS pragma I've come across a comment 的错误报告:
Setting the rounding mode without using
#pragma STDC FENV_ACCESS ON
invokes undefined behavior. See C11 7.6.1/2. (This pragma does not exist in C++, so <cfenv> is unusable, but that's not our fault...)
这个 pragma 真的不存在于 C++ 中,导致 <cfenv>
无法使用吗?我试图在 C++11 标准中搜索它,但实际上根本没有提到它。编译指示是否与函数原型一起从 C 继承?或者它们实际上不需要避免 UB,因为 C++ 标准没有说明在未使用 pragma 时未定义的行为(由于根本没有提及 pragma)?
我搜索了 2015 年标准草案文本,没有发现 FENV_ACCESS。 http://cppreference.com也一无所知。
但是,http://cplusplus.com 确实提到了它(因为它不在标准中,我认为我们必须假设这充其量只是建议信息):
http://www.cplusplus.com/reference/cfenv/FENV_ACCESS/
引自cplusplus.com:(强调我的)
If set to on, the program informs the compiler that it might access the floating-point environment to test its status flags (exceptions) or run under control modes other than the one by default.
If set to off, the compiler may perform certain optimizations that can subvert these tests and mode changes, and thus accessing the floating-point environment in the cases described above, causes undefined behavior.
Whether the state of this pragma by default is on or off depends on the compiler settings and library implementation.
鉴于令人不安的不明确性,我希望尽可能避免使用它。
一如既往,如果使用是不可避免的,我想将它封装到一个 class 中,我可以专门针对每个架构进行测试。
然后记录这个 class 的存在以及如果编译器、环境或库实现升级可能导致的麻烦。
更新:
c++标准中对header有一个非常简短的提及:
§ 26.3 The floating-point environment [cfenv]
...
2 The header defines all functions, types, and macros the same as Clause 7.6 of the C standard.
更新:
这里有更多信息:http://en.cppreference.com/w/cpp/preprocessor/impl
我的理解是编译指示是由 C11 标准定义的,而不是 C++11 标准。因此在 C++ 程序中使用严格 implementation/un-defined.