Home > 2006-06 / CからC++へ > This Entry [com : 0][Tb : 0]
良し悪しは別にして、同じ有効範囲内で、同じ名前 foo を、こんなに使い回すことができるのは、Cの名前空間によるものでした。void func(void)
{
struct foo
{
int foo;
} foo;
goto foo;
foo:
}
のように記述した場合、3つのfoo関数は別の関数ということになります。そして、Aという名前空間で定義されたfooを参照するにはA::fooと記述します。Bという名前空間で記述されたfooを参照するにはB::fooと記述します。namespace A
{
void foo();
}
namespace B
{
void foo();
}
void foo();
このように、より内側の有効範囲で同名の識別子(ここではfoo)を宣言した場合でも、外側である大域的名前空間のfooにアクセスすることができています。もっとも、このような使い方は混乱の原因ですので、あまり積極的には使わない方がよいでしょう。int foo;
void func()
{
int foo;
foo = ::foo;
}
のように、何重かに入れ子にすることで、サブモジュール化をするのに便利になっています。しかし、あまり入れ子のレベルが深くなると、毎回、有効範囲解決演算子を用いて名前空間を指定するのが面倒です。そんな場合にはキーワード using を使用します。namespace A
{
namespace B
{
void func();
}
}
とすれば、A::B名前空間に属している識別子を、名前空間の指定なしで参照することができるようになります。ただし、その結果として、名前の解決が曖昧になる場合もありますので、十分注意が必要です。また、using namespace A::B;
のようにすれば、A::B名前空間に属しているfuncという識別子だけを、名前空間の指定なしで使用することができるようになります。これは識別子単位で指定することになるので、関数が多重定義されている場合には、それらの全てに対して働くことになります。using A::B::func;
のようにします。namespace C = A::B;
無名名前空間は「無名」なので、有効範囲解決演算子で名前空間を指定することはできません。というより指定する必要がありません。つまり、上の場合、無名名前空間の外部であっても、funcとするだけで、参照することができます。namespace
{
void func();
}
http://cppemb.blog17.fc2.com/tb.php/76-f6e7c60d
Comment