C11和更高版本中是否存在FENV_ACCESS编译指示?

阅读clang not supporting FENV_ACCESS pragma的错误报告我遇到了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标准中搜索它,但实际上根本没有提到它. pragma是否继承了C和函数原型?或者他们实际上不需要避免使用UB,因为当不使用编译指示时,C标准没有说明未定义的行为(由于根本没有提到编译指示)?

解决方法:

我搜索了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.

鉴于令人不安的缺乏清晰度,我想尽可能避免使用它.

与以往一样,如果使用是不可避免的,我想将它封装到一个我可以专门化并测试每个架构的类中.

然后记录此类的存在以及在升级编译器,环境或库实现时可能导致的问题.

更新:

有一个非常简短的提及c标准中的标题:

§ 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

我对此的解读是,pragma是由C11标准定义的,而不是C11标准.因此,在c程序中使用是严格实现/未定义的.

上一篇:c-gcc相当于#pragma注释


下一篇:浅析C++预处理命令