2014-03-13 145 views
0

gcc(4.8.1)和clang(3.4)編譯我的C++程序,它使用std::log2(x)。這是否符合標準?std :: log2()是擴展還是C++標準?

+2

爲什麼不應該這樣?谷歌搜索這個功能顯示[它是C++標準庫的一部分](http://en.cppreference.com/w/cpp/numeric/math/log2)自C++ 11以來。如果它不是標準庫的一部分,將它添加到'std'命名空間是未定義的行爲。換句話說,沒有像標準庫的「擴展」那樣的東西,說起'std'命名空間。 – leemes

+0

@leemes符合的實現不允許將名稱添加到任何標準頭文件中的「std」名稱空間。一個簡單的原因是,如果'foo'沒有被定義爲標準庫的一部分,用戶可以在包含標準頭之前將'foo'定義爲宏。如果頭文件試圖將'foo'定義爲(例如)一個函數,宏將被擴展,並且一個有效的程序將被拒絕。 – hvd

+0

@ hvd我知道...我不知道你爲什麼這麼說。您是否想將我的評論添加進去,或者您誤解了我想說的內容? ;)我的觀點是:由於不允許將內容添加到'std',因此不存在對標準庫的「擴展」,比如在添加C++ 11之前的'log2'。 – leemes

回答

4

它現在包含在自C++ 11以來的<cmath>標頭中。

你可以在這裏找到更多的信息:std::log2

+0

我是在這個網站上查找,它的搜索功能沒有(現在仍然沒有)在搜索'std :: log2'或'log2'時拿出這個頁面:-( – Walter

+0

@Walter足夠奇怪。感謝接受 – taocp

1

如果您使用的是較早的C++編譯器不具有此功能,您可以使用log(x)/log(2.0)

+0

是的,我知道,這通常會調用'std :: log()'兩次。 – Walter

+1

@Walter因爲它永遠不會改變,所以''log(2.0)''你總是可以使用一個硬編碼的常量'0.693147180559945309 '應該工作。 –

相關問題