[英]C++ gcc `floorf` not a member of `std`?
我有以下代碼:
#include <cmath>
float foo(float x, unsigned int m, float q = 0.0f)
{
return std::floorf(x * float(m) + q);
}
現在,當我嘗試使用g ++ 5.4.0和選項-std=c++11
進行編譯時,我收到一條錯誤消息,指出'floorf' is not a member of 'std'
。
現在,我的理解是C ++ 11標准的第26.8條要求標准C ++庫頭文件<cmath>
聲明與標准C庫頭文件<math.h>
相同的功能集,盡管在命名空間std
; 第1.2款規定“ C”應解釋為C99; 並且C99標准的第7.12.9.2條要求標准C庫頭文件<math.h>
聲明一個函數float floorf(float)
。
因此,根據該推理, <cmath>
應該聲明一個函數float std::floorf(float)
,據我所知,該函數應該與我的代碼匹配。
是什么賦予了? 我在這里想念什么嗎?
(我知道C ++ 11還定義了一個 float std::floor(float)
;但是,我最近發現,以f
后綴的float函數變體通常要快一些,因此我更喜歡專門調用floorf()
。)
我相信您確實在標題中發現了一個錯誤。 在我的GCC上,使用GNU C庫(glibc),我可以通過退出std::
到全局名稱空間中來進行變通,
return std::floorf(x * float(m) + q);
至
return ::floorf(x * float(m) + q);
解決方法之所以有效,是因為floorf()
屬於C標准庫,因此它在glibc中具有全局符號。 由於解決方法使用C ++ 11允許但不需要存在的全局符號,因此該解決方法是不可移植的。 不過,對於glibc來說,它似乎可以工作。
如果您願意,可以通過將#include <cmath>
更改為#include <math.h>
並(據我所知)將所有C-math-library調用放到全局名稱空間中,來使解決方法可移植。 不過,這仍然只是一種解決方法。
您可以繼續將其報告為錯誤, 網址為: https : //gcc.gnu.org/bugzilla/ 。 此外,要讓GCC團隊更加認真地對待,您可以在此處將錯誤報告鏈接回去,以表明已經有幾雙合格的眼睛已經在看問題。 同時,做得很好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.