簡體   English   中英

-O1 / 2/3 with -std = c ++ 1y / 11/98 - 如果包含<cmath>我收到錯誤:'_hypot'未在此范圍內聲明

[英]-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++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)); }

我這邊有什么不對勁嗎?
或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版本),則應升級。

正如Keith所說,這是MinGW.org標題中的一個錯誤。

作為編輯MinGW.org標題的替代方法,您可以使用MinGW-w64 ,它提供了MinGW.org提供的所有功能,還有更多功能。 有關運行時之間差異的列表,請參閱此Wiki頁面

MinGW使用gcc和Microsoft運行時庫。 微軟的實現支持C90,但它對更高版本的C標准(C99和C11)的支持非常差。

hypot功能(連同hypotfhypotl在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM