2

rand()は、 の関数の例として<cstdlib>、グローバルとstd名前空間の両方に存在することを理解しています。

実際には、以下はエラーなしでコンパイルされます。つまり、 と の両方の呼び出しはstd::rand()正当rand()です。

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

これは何に使用され、どのように正確に実装されていますか (関数は両方の名前空間にあります)?

4

2 に答える 2

5

動作は、標準に従って指定されていない動作です。
標準に従って、名前空間および場合によってはグローバル名前空間cstdlibにシンボル名をインポートします。stdグローバル名前空間に含まれているシンボル名に依存している場合、プログラムは移植性がなく、特定の実装の動作に依存しています。


実装動作に依存しないようにするには、次のことを行う必要があります。

cstdlibの完全修飾名を含めて使用しrandます。

std::rand()

参照:

C ++ 11標準:D.5 C標準ライブラリヘッダー
パラ3:

[例:ヘッダー<cstdlib>は、名前空間内でその宣言と定義を確実に提供しますstd。また、グローバル名前空間内でこれらの名前を提供する場合もあります。ヘッダー<stdlib.h>は、C標準の場合と同様に、グローバル名前空間内で同じ宣言と定義を確実に提供します。また、名前空間内にこれらの名前を提供する場合もありますstd。—例を終了]


良い読み物:
C ++プログラムに<xxxx.h>または<cxxxx>を含める必要がありますか?

于 2013-02-23T05:37:17.107 に答える
2

その理由は、もともとはC関数だからです。それはCから来ています。

C ++は、これらのようなC関数をstd名前空間に再実装しました。私が知っている違いはありませんが、C++プログラマーはstd::名前空間で関数を使用することをお勧めします。最初に「c」whateverヘッダー(「cstdlib」ヘッダーで実際に行ったことです)を含めます。

(ちなみに、プレーンCプログラマーは「stdlib.h」ヘッダーを含めます。)

于 2013-02-23T05:38:28.640 に答える