簡體   English   中英

C ++ gcc`floorf`不是`std`的成員嗎?

[英]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.

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