WindowsプログラマのWebアプリへの挑戦日記。あとパンとか。

無名のnamespaceの中にstatic?

1月 14th, 2009 Posted in C++

C++の名前空間を定義するnamespaceってあんまり使わない。たぶん有用な使い方があるんだろうと思うけど、所属しているチームではほとんど使われていないので、今まで積極的に使おうとは思っていなかった。

using namespaceはたまに使う。まあアレです。

  1. using namespace std;

です。これを書いておくと

  1. std::vector v;

  1. vector v;

って書くことができる。

無名のnamespace

最近、新しいプロジェクトに関わるようになってきて、初めてのコードをよく読むようになりました。その中で、cppファイルのグローバルな領域に以下のような記述が。

  1. namespace {
  2.     const TCHAR szHoge[] = _T("Hoge\Hoge");
  3. }

ほう、こういう書き方があるるんだねぇと思って調べると、無名の名前空間はグローバルなstatic変数に変わる書き方で、C++ではグローバルなstaticの代わりに無名の名前空間を使うことが推奨されているらしい。

なるほど。無名の名前空間内の変数はグローバルなstatic変数と。よしよし。

と思って他のソースを読んでいると、今度は以下のような記述が!

  1. namespace {
  2.     static const int nHoge = 50;
  3. }

“static const”は定数を定義するときに使うんだけど、無名の名前空間内にstaticを付ける意味ってあるんだろうか。よくわからんのでこのコードを書いた人に聞いてみよう。

追記:書いた本人に聞いてみた

無名の名前空間内のstatic変数ですが、これはもともと

  1. static const int nHoge = 50;

だったコードがあって、チーム内の方針でグローバルな静的変数は無名の名前空間内で定義するように変更しようってことで、staticは付けたまま上記のようになったということです。つまりあんまり深い意味はないそうです。

こちらもオススメ!

Trackback URL

  1. 2 Responses to “無名のnamespaceの中にstatic?”

  2. By sora on 1月 15, 2009

    ほぇー!
    そんな意味あったんですね。知りませんでした。
    勉強不足っす。

    ライブラリ見てると結構こういう
    namespace のこの使い方してるの見た覚えが
    あって、横着かまして勝手に別の意味に解釈して
    おりました・・・orz

    勉強になりまっす!
    それにしてもやっぱ c++ 良いなー。。。

  3. By yosuke on 1月 15, 2009

    >soraさん
    そうなんですよ。
    ホントに今は井の中の蛙状態なので、知らんことは積極的に調べて身につけないといけんですね。

    namespaceのなかのstaticは、コード書いた人に意図を聞いたら報告します。

Post a Comment