-O1/2/3 with -std = c ++ 1y/11/98 - 如果包含<cmath>我收到错误:'_hypot'未在此范围内声明

Hol*_*Cat 9 c++ mingw mingw32

我刚刚更新MinGW的使用mingw-get-setup状态,我无法构建一个包含点儿什么<cmath>,如果我使用任何大于头-O0-std=c++1y.(我也试过c++11c++98)我得到象这样的错误之一:

g++.exe -pedantic-errors -pedantic -Wextra -Wall -std=c++1y -O3  -c Z:\Projects\C++\L6\src\events.cpp -o obj\src\events.o
In file included from z:\lander\mingw\lib\gcc\mingw32\4.8.1\include\c++\cmath:44:0,
                 from Z:\Projects\C++\L6\src\utils.h:4,
                 from Z:\Projects\C++\L6\src\events.cpp:10:
z:\lander\mingw\include\math.h: In function 'float hypotf(float, float)':
z:\lander\mingw\include\math.h:635:30: error: '_hypot' was not declared in this scope
 { return (float)(_hypot (x, y)); }
Run Code Online (Sandbox Code Playgroud)

我这边有什么不对劲吗?
或mingw repo的版本被窃听?如果是这样,这个标题有什么快速解决方法吗?

Kei*_*all 15

为了避免任何进一步的推测,以及诸如使用等彻头彻尾的糟糕建议#if 0,让我从MinGW项目贡献者的角度给出权威的答案.

是的,MinGW.org的实现include/math.h确实在其内联实现中存在错误hypotf (float, float); 编译C++时会触发错误,包含受影响的标头(cmath包括在内时),__STRICT_ANSI__指定导致定义的任何编译器选项(如-std=c...OP 所指出的那些选项的情况).适当的解决方案不是math.h#if 0或以其他方式遮挡文件的一部分,而是纠正破坏的内联实现hypotf (float, float); 简单地从内联引用中删除虚假的前导下划线_hypot (float, float),其返回值被强制转换为float返回类型就足够了.

可替换地,取代的等效-std=gnu...-std=c...在编译器选项应该绕过错误,并且可以提供一个合适的解决方法.

FWIW,我对MinGW.org目前的实施情况并不满意hypotl (long double, long double); 纠正这两个问题是我的MinGW运行时的下一个版本的打卡列表,但ATM,我几乎没有时间专门准备这个.

更新

当前版本的MinGW.org运行时库(目前是mingwrt-3.22.4,但自3.22版本以来已修复)中不再出现此错误.如果你正在使用什么比这更旧,(包括任何的的批判破 4.x的版本),你应该升级.