gpt4 book ai didi

c++ - FENV_ACCESS pragma 是否存在于 C++11 及更高版本中?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:14:07 28 4
gpt4 key购买 nike

阅读 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 标准中搜索它,但实际上根本没有提到它。编译指示是否与函数原型(prototype)一起从 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.

鉴于令人不安的不明确性,我希望尽可能避免使用它。

一如既往,如果使用是不可避免的,我想将它封装到一个类中,我可以专门针对每个架构进行测试。

然后记录这个类的存在,以及如果编译器、环境或库实现升级可能带来的麻烦。

更新:

在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

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

关于c++ - FENV_ACCESS pragma 是否存在于 C++11 及更高版本中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36218367/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com