(1)宣言・定義の仕方
namespace zoo { const int VERSION=1; }
これで、名前空間 zoo とその中の定数VERSIONが定義されました。
(2)利用法
・中で使うnamespace zoo { bool isVersion(int v){ return (v == VERSION); } }・外で使う
どの名前空間のなかの変数かを指定します。
bool isZooVersion(int v){ return (v == zoo::VERSION); }・いちいち名前空間を指定するのが面倒な場合は?
using を使う
using zoo::VERSION; bool isZooVersion(int v){ return (v == VERSION); }・ごっそり指定する?
using namespace を使う。
using namespace zoo; bool isZooVersion(int v){ return isVersion(v); }
■ ご利益/デメリット
- const int ZOO_VERSION などと長い名前にしないでよい。
- (using)別の名前空間にある名前が using で衝突するかも
例えば、zoo::VERSION, foo::VERSIONが定義されているとき、using zoo::VERSION; using namespace foo; でただVERSIONと書かれていた場合。
- 名前が隠れる(これは、へまするとややこしいバグになる)。
■ 名前スペース、名前フォルダ、名前置き場
とまあ、ここまではどうでもいいのですが、namespaceのニュアンスの話です。
これまでは「名前空間」という言葉から、
「宇宙のように広大な空間を創造して、
その中で作業をする」というイメージでした(大袈裟?)。
でも、ふと「名前のスペース」と読んでみると、
これは単に「名前の置き場所」に過ぎないのかな、と思いました。
つまり、範囲を明確にして、バッティングを防ぐ。
ディレクトリと同じ構造だし、名前フォルダとも意訳できる?。
■ usingは邪道?王道?
その目的から考えると、usingは邪道かというと、やっぱり邪道でしょう。
でも、それがなければ、ものぐさなプログラマは
#define Z_VERSION zoo::VERSIONなどともっと邪道なことをするので(笑)、
用意しているのでしょう(まあ、そんなことよりCコードとの共存のためな気もしますが)。
ファイルのアナロジーでは、パスを通す感じでしょうか。
しかし、usingは「ある名前空間に依存している」ということを
明確に宣言しているという意味では、依存関係がわかりやすい構文でもあるのかも。
結論を言うと、nameの置き場所(space)はよく考えましょう、ということで。