無名の名前空間
ロベールの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
こんな感じですね。
ただちょっと理解があいまいかもしれないのでもう少し調べる必要がありますね。