using namespaceの範囲。

今のプロジェクトはネームスペース使いまくりんぐで、
using namespaceの効果範囲は如何ほどなのだろうと思ってちょっとテストしてみた。


ケース1

#include 

namespace
{
// このファイル全てのスコープで有効になる
using namespace std;

string s; // OK
}

class S
{
string _s; // OK
};

void Func()
{
string s; // OK
}

無名ネームスペースでusingすると、そのファイルにあるスコープ全てで有効になる模様。
グローバルネームスペースで使ったのと変わらない感じ。


ケース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が使えれば
安全に出来たんだけど、それもダメみたいだし。
うーん残念。