[C++] namespaceに関する雑感 --- 「名前空間」ってちょっと大袈裟?

namespaceは一般に「名前空間」と訳されます。

(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)はよく考えましょう、ということで。