2013-02-23 49 views
2

我知道rand()作爲<cstdlib>的示例函數存在於全局命令空間和std命名空間中。爲什麼rand()在cstdlib的全局和std命名空間中都存在?

實際上,以下內容將無誤地編譯,即對std::rand()rand()的調用都是合法的。

#include <cstdlib>  
int main() { 
    std::rand(); 
    rand();  
} 

這有什麼用,它究竟是如何實現的(該函數在兩個名稱空間中)?

+0

'的std :: rand'是C++標準庫的一部分,同時'rand'爲ANSI C兼容性。 – 2013-02-23 05:37:11

回答

5

行爲是根據標準指定的行爲
按照包括cstdlib的標準,在std命名空間中並可能在Global命名空間中導入符號名稱。如果您依賴全局名稱空間中包含的符號名稱,那麼您的程序是不可移植的,並且您依賴於特定實現的行爲。


不要依賴於你必須實現The行爲:

包括cstdlibrand使用完全合格的名稱。

std::rand() 

參考文獻:

C++ 11標準:D.5 C標準庫頭
第3段:

[實施例:頭<cstdlib>確實在命名空間內提供了它的聲明和定義。它也可能在全局命名空間中提供這些名稱。頭文件<stdlib.h>確實在全局名稱空間內提供了相同的聲明和定義,與C標準中的一樣。它也可以在命名空間std中提供這些名稱。例如末端]


良好閱讀:
Should I include <xxxx.h> or <cxxxx> in C++ programs?

+2

它不是實現定義的;它沒有說明。不同之處在於實現的定義意味着需要實現文檔來記錄它的功能。 – 2013-02-23 13:24:20

+0

@PeteBecker:是的。 – 2013-02-23 13:30:03

+0

感謝澄清。未指定的行爲雖然回答了「何時」(即,何時將編譯上述代碼)。任何關於如何在兩個命名空間中提供它們的想法,可能是這種情況,即通過相同的實現? – gevang 2013-02-23 18:31:21

2

的原因是,它最初是一個C函數。它來自C.

C++重新實現像這樣的C函數到std命名空間。我所知道的沒有區別,但建議C++程序員在std :: namespace中使用函數,首先包括「c」任何頭文件(這就是您使用「cstdlib」頭文件所做的)。

(純C程序員將包括 「stdlib.h中」 頭,通過的方式。)

+0

關於cstdlib中函數的來源,是的。但是這並不能解決雙命名空間轉換的目的/細節。如您所指出的,C++實現無關行爲的標準實踐是std :: rand()。 – gevang 2013-02-23 18:34:54

相關問題