我知道rand()
作爲<cstdlib>
的示例函數存在於全局命令空間和std
命名空間中。爲什麼rand()在cstdlib的全局和std命名空間中都存在?
實際上,以下內容將無誤地編譯,即對std::rand()
和rand()
的調用都是合法的。
#include <cstdlib>
int main() {
std::rand();
rand();
}
這有什麼用,它究竟是如何實現的(該函數在兩個名稱空間中)?
我知道rand()
作爲<cstdlib>
的示例函數存在於全局命令空間和std
命名空間中。爲什麼rand()在cstdlib的全局和std命名空間中都存在?
實際上,以下內容將無誤地編譯,即對std::rand()
和rand()
的調用都是合法的。
#include <cstdlib>
int main() {
std::rand();
rand();
}
這有什麼用,它究竟是如何實現的(該函數在兩個名稱空間中)?
行爲是根據標準指定的行爲。
按照包括cstdlib
的標準,在std
命名空間中並可能在Global命名空間中導入符號名稱。如果您依賴全局名稱空間中包含的符號名稱,那麼您的程序是不可移植的,並且您依賴於特定實現的行爲。
不要依賴於你必須實現The行爲:
包括cstdlib
和rand
使用完全合格的名稱。
std::rand()
參考文獻:
C++ 11標準:D.5 C標準庫頭
第3段:
[實施例:頭
<cstdlib>
確實在命名空間內提供了它的聲明和定義。它也可能在全局命名空間中提供這些名稱。頭文件<stdlib.h>
確實在全局名稱空間內提供了相同的聲明和定義,與C標準中的一樣。它也可以在命名空間std
中提供這些名稱。例如末端]
它不是實現定義的;它沒有說明。不同之處在於實現的定義意味着需要實現文檔來記錄它的功能。 – 2013-02-23 13:24:20
@PeteBecker:是的。 – 2013-02-23 13:30:03
感謝澄清。未指定的行爲雖然回答了「何時」(即,何時將編譯上述代碼)。任何關於如何在兩個命名空間中提供它們的想法,可能是這種情況,即通過相同的實現? – gevang 2013-02-23 18:31:21
的原因是,它最初是一個C函數。它來自C.
C++重新實現像這樣的C函數到std命名空間。我所知道的沒有區別,但建議C++程序員在std :: namespace中使用函數,首先包括「c」任何頭文件(這就是您使用「cstdlib」頭文件所做的)。
(純C程序員將包括 「stdlib.h中」 頭,通過的方式。)
關於cstdlib中函數的來源,是的。但是這並不能解決雙命名空間轉換的目的/細節。如您所指出的,C++實現無關行爲的標準實踐是std :: rand()。 – gevang 2013-02-23 18:34:54
'的std :: rand'是C++標準庫的一部分,同時'rand'爲ANSI C兼容性。 – 2013-02-23 05:37:11