Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ -O1/2/3,带-std=c++;1998年11月1日-If<;cmath>;包括i';我得到一个错误:'_hypot';未在此范围中声明_C++_Mingw_Mingw32 - Fatal编程技术网

C++ -O1/2/3,带-std=c++;1998年11月1日-If<;cmath>;包括i';我得到一个错误:'_hypot';未在此范围中声明

C++ -O1/2/3,带-std=c++;1998年11月1日-If<;cmath>;包括i';我得到一个错误:'_hypot';未在此范围中声明,c++,mingw,mingw32,C++,Mingw,Mingw32,我刚刚用MinGW get setup更新了MinGW,如果我用-O0和-std=c++1y使用任何大于-O0的内容,我就无法生成任何包含头的内容。(我还尝试了c++11和c++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:\l

我刚刚用
MinGW get setup
更新了MinGW,如果我用
-O0
-std=c++1y
使用任何大于
-O0
的内容,我就无法生成任何包含
头的内容。(我还尝试了
c++11
c++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)); }
我这边有什么问题吗?

或者明威回购的版本被窃听了?如果是这样的话,这个标题有什么快速修复方法吗?

MinGW使用gcc和Microsoft运行时库。微软的实现支持C90,但是它对更高版本的C标准(C99和C11)的支持非常差

C99中添加了
hypot
功能(以及
hypotf
hypotl

如果调用
hypot
的程序出现此错误,例如:

#include <cmath>
int main() {
    std::cout << std::hypot(3.0, 4.0)) << '\n';
}
#包括
int main(){

std::cout为了避免任何进一步的猜测和彻头彻尾的错误建议,例如使用
#if 0
,让我从MinGW项目贡献者的角度给出一个权威的答案

是的,<> C++的明文.Org实现包括/Maul.H./Cux>在其代码实现中有一个bug:<代码> Untf(浮点、浮点)< /> >;编译C++时触发错误,包含受影响的头(如<代码> CMASUD/COMPE >时所包含的错误),并指定导致定义

\uuuuu STRICT\u ANSI\uuuu
的任何编译器选项(与OP注意到的那些
-std=c..
选项的情况相同)。适当的解决方案不是用
#if 0
或其他方式阻塞
math.h
文件的一部分,而是纠正
hypotf(float,float)
的中断内联实现;只需从
\u hypot(float,float)的内联引用中删除虚假的前导下划线即可
,其中其返回值转换为浮点返回类型就足够了


或者,在编译器选项中用等效的
-std=gnu…
替换
-std=c…
,可以避免该错误,并提供适当的解决方法

FWIW,我对MinGW.org当前实现的
hypotl(longdouble,longdouble)
也不太满意;在MinGW运行时的下一个版本中,纠正这两个问题是我的工作重点,但是ATM,我几乎没有时间来准备这个

更新


当前版本的MinGW.org运行库(当前为mingwrt-3.22.4,但自3.22版以来已修复)中不再存在此错误。如果您使用的是比此更早的版本(包括严重损坏的版本的any),您应该升级。

正如Keith所指出的,这是MinGW.org标题中的一个bug

作为编辑MinGW.org标题的另一种选择,您可以使用,它提供了MinGW.org提供的一切,以及更多。
有关运行时之间的差异列表,请参阅。

您是否尝试将
-lm
添加到
g++
命令行的末尾?@KeithThompson相同的错误。您是否能够重现该错误?该问题是否发生在具有
\include
的任何程序中,或者仅发生在调用
hypot()的程序中
?@KeithThompson任何带有
#include
@KeithThompson
-lm
的程序在MinGW中都是冗余的;
libm.a
实际上是一个空存档,数学功能由默认的C运行库提供,(微软的MSVCRT.DLL本身,或者MinGW.org的libmingwex.a扩展库,这两个库都是默认搜索的)。或者,用一个等价的-std=gnu…代替-std=c…那么你是说用-std=gnu++0x代替-std=c++0x吗?@ScottF:“你是说用-std=gnu++0x代替-std=c++0x吗?”。是的,正是这样。其效果是启用相应的
-std=c..
选项的语义(这可能很重要),但不抑制GNU扩展,特别是避免使用
\uuu STRICT\u ANSI\uuu
规范。如果上面的测试程序想要调用
hypot
不合格,那么它可能应该包括
。@JonathanWakely:我把它改为
std::hypot