ここで「名前空間」について少し説明します。
C++の標準ライブラリの多くは「名前空間std」に所属していると書きました。
「cout」や「cin」も「std」に所属しています。
1つ前のプログラムを再度書きます。
<sample program cpp003-02>
#include <iostream> int main() { char str[100]; std::cin >> str; std::cout << "str = " << str << std::endl; return 0; } |
<実行結果>
abc str = abc 続行するには何かキーを押してください・・・
↑の書き方は、所属するストリームの前に毎回「std::」と書いていますが、別の書き方もあります。
<sample program cpp004-01>
#include <iostream>
using namespace std;
int main()
{
char str[100];
cin >> str;
cout << "str = " << str << endl;
return 0;
}
|
<実行結果>
abc str = abc 続行するには何かキーを押してください・・・
using namespace std;
と書く事で「名前空間stdを使います」という宣言になり、「std::」を毎回付けなくても実行出来るようになります。
前に「名前空間」は新しいスコープと書きました。
大きなプロジェクトなどで、変数や関数などに同じ名前が付いてしまい、バグが発生する事を防ぐためのものです。
変数名や関数名が同じでも「名前空間」が異なれば、違うものとして認識されます。
次のサンプルを書いて、実行してみてください。
<sample program cpp004-02>
#include <iostream> using namespace std; namespace MyNamespaceA { int value; } namespace MyNamespaceB { int value; } int main() { MyNamespaceA::value = 12; cout << "value = " << MyNamespaceA::value << endl; MyNamespaceB::value = 25; cout << "value = " << MyNamespaceB::value << endl; return 0; } |
<実行結果>
value = 12 value = 25 続行するには何かキーを押してください・・・
valueという変数が2つありますが、別の「名前空間」に所属しています。
所属が異なるため、この2つの変数は競合しません。
「名前空間」には関数や定数(const)なども所属させる事が出来ます。
ただし、次のように書いた場合はエラーになります。
<sample program cpp004-03>
#include <iostream> using namespace std; namespace MyNamespaceA { int value; } namespace MyNamespaceB { int value; } using namespace MyNamespaceA; using namespace MyNamespaceB; int main() { value = 12; cout << "value = " << value << endl; return 0; } |
<コンパイル結果>
error C2872: 'value': あいまいなシンボルです。 note: 'int MyNamespaceA::value' の可能性があります note: または 'int MyNamespaceB::value' error C2872: 'value': あいまいなシンボルです。 note: 'int MyNamespaceA::value' の可能性があります note: または 'int MyNamespaceB::value'
using namespaceを使って、名前空間名を省略出来るようにしました。
この場合「value」と書くと、MyNamespaceAの「value」なのかMyNamespaceBの「value」なのか区別が付かなくなります。
きちんと所属を書く事をお勧めします。