[英]-O1/2/3 with -std=c++1y/11/98 - If <cmath> is included i'm getting error: '_hypot' was not declared in this scope
我剛剛使用mingw-get-setup
更新了MinGW,如果我使用大於-O0
且-std=c++1y
任何東西,我就無法構建包含<cmath>
標頭的任何東西。 (我也嘗試過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 repo的版本被竊聽? 如果是這樣,這個標題有什么快速解決方法嗎?
為了避免任何進一步的推測,以及使用#if 0
等徹頭徹尾的糟糕建議,讓我從MinGW項目貢獻者的角度給出一個權威的答案。
是的, include/math.h
的MinGW.org實現在其內聯實現hypotf (float, float)
確實存在錯誤; 編譯C ++時會觸發錯誤,包含受影響的標頭(因為包含cmath
時), 並且指定了導致__STRICT_ANSI__
定義的任何編譯器選項(對於那些-std=c...
OP指出的備選方案。 適當的解決方案不是用#if 0
或其他方式遮擋math.h
文件的一部分,而是糾正hypotf (float, float)
的破壞內聯實現hypotf (float, float)
; 簡單地從內聯引用_hypot (float, float)
刪除虛假的前導下划線,其中返回值被_hypot (float, float)
轉換為float返回類型就足夠了。
或者,在編譯器選項中替換等效的-std=gnu...
for -std=c...
應繞過該錯誤,並可能提供合適的解決方法。
FWIW,我對MinGW.org目前實施的hypotl (long double, long double)
也不是很滿意; 糾正這兩個問題是我的MinGW運行時的下一個版本的打卡列表,但ATM,我幾乎沒有時間專門准備這個。
更新
當前版本的MinGW.org運行時庫(目前是mingwrt-3.22.4,但自3.22版本以來已修復)中不再出現此錯誤。 如果您使用的是舊版本(包括任何 嚴重損壞的 4.x版本),則應升級。
MinGW使用gcc和Microsoft運行時庫。 微軟的實現支持C90,但它對更高版本的C標准(C99和C11)的支持非常差。
的hypot
功能(連同hypotf
和hypotl
在C99中加入)。
如果您使用調用hypot
的程序收到此錯誤,例如:
#include <cmath>
int main() {
std::cout << std::hypot(3.0, 4.0)) << '\n';
}
那么它只是Microsoft運行時庫的限制,因此也是MinGW的限制。 如果它出現在任何具有#include <cmath>
程序中,那么它就是MinGW中的一個錯誤,可能是一個配置錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.