無名の名前空間

ロベールのC++入門講座 08-13

namespaceを名前無しで定義すると無名の名前空間になります。

namespace {
    int i = 100;
}

こうして定義されたi変数はスコープがファイル内(ブロック内ではないことに注意)に限られます。

// -- main.cpp --
#include <iostream>

namespace {
    int i = 100;
}

int main () {
    // iはファイルスコープなのでここでもアクセスできる。
    std::cout << i << std::endl;
    return 0;
}
// -- main2.cpp --
extern int i;
int j = i; // i変数はmain.cppのファイルスコープなのでアクセスできない
$ cl /W4 /EHs main.cpp main2.cpp
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

main.cpp
main2.cpp
コードを生成中...
Microsoft (R) Incremental Linker Version 9.00.30729.01
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:main.exe
main.obj
main2.obj
main2.obj : error LNK2019: 未解決の外部シンボル "int i" (?i@@3HA) が関数 "void _
_cdecl `dynamic initializer for 'j''(void)" (??__Ej@@YAXXZ) で参照されました。
main.exe : fatal error LNK1120: 外部参照 1 が未解決です。

ちなみにある名前空間の中で無名の名前空間を定義した場合は、そこに存在しているかのように振舞います。

#include <iostream>

namespace Foo {
    namespace {
        int i = 100;
    }
}

int main () {
    std::cout << Foo::i << std::endl;
    return 0;
}
$ main
100

こんな感じですね。

ただちょっと理解があいまいかもしれないのでもう少し調べる必要がありますね。