using namespaceの範囲。
今のプロジェクトはネームスペース使いまくりんぐで、
using namespaceの効果範囲は如何ほどなのだろうと思ってちょっとテストしてみた。
ケース1
#include無名ネームスペースでusingすると、そのファイルにあるスコープ全てで有効になる模様。namespace
{
// このファイル全てのスコープで有効になる
using namespace std;string s; // OK
}class S
{
string _s; // OK
};void Func()
{
string s; // OK
}
グローバルネームスペースで使ったのと変わらない感じ。
ケース2
#include無名で無くすると、そのスコープだけで有効に。まあ当たり前か。namespace Hoge
{
// Hogeネームスペースのみで有効になる
using namespace std;string s; // OK
}class S
{
string _s; // NG
};void Func()
{
string s; // NG
}
ケース3
#include同じネームスペースなら、違うブロックで定義しても大丈夫な模様。//namespace Hoge
//{
// string s0; // NG, このコメントブロックを外すとs1,2も何故かNGになる
//}namespace Hoge
{
using namespace std;string s1; // OK
}namespace Hoge
{
string s2; // OK
}
ただし、usingされる前では使えないどころか全部エラーになっちまいました。
VCの仕様?
ケース4
#includeまあコレはわかりきったコードですね。void Func1()
{
using namespace std;
string s; // OK
}
void Func2()
{
string s; // NG
}
ケース5
#includeクラススコープでは使えない模様。class S
{
using namespace std; // そもそもコレがNG
string _s;
};
酷いよC++の神様ー。
使えたっていいじゃないか。
結局のところ何が調べたかったかというと、
ヘッダファイルでusing namespaceを記述した場合の影響範囲でして。
ネームスペースを多用すると、シンボル名の衝突が避けられるのと同時に、
記述が冗長になるわけで、cppファイルの中なら先頭でusingすれば
良いわけですけど、ヘッダファイルでは、後にインクルードされるヘッダや、
インクルードしたcppにまで影響が出てしまうのでそうはイカンと。
影響をそのヘッダだけに留めて、うまく冗長性を排除出来ればなあと
思った次第で。
でもこの結果を見ると、冗長だけどヘッダではガマンして書くしかなさそう。
同じネームスペースでusingされる(特にプロジェクト用のデカいネームスペース等)と、
やっぱり他のファイルで影響が出るし、クラススコープでusingが使えれば
安全に出来たんだけど、それもダメみたいだし。
うーん残念。