「無名名前空間」の版間の差分

提供: C++入門
移動: 案内検索
(ページの作成:「無名名前空間 (unnamed namespace) とは、無名の名前空間です。C言語の変数、関数にstaticで修飾することで、ファイル内のみ...」)
 
(相違点なし)

2014年7月9日 (水) 16:09時点における最新版

無名名前空間 (unnamed namespace) とは、無名の名前空間です。C言語の変数、関数にstaticで修飾することで、ファイル内のみの局所的な変数、関数にすることができました。C++では、無名名前空間で同様のことができます。

匿名名前空間(anonymous namespace)と呼ばれることもありますが、C++の規格上の正式名称は、無名名前空間 (unnamed namespace) です。

読み方

無名名前空間
むめい なまえくうかん
unnamed namespace
あんねいむど ねーむすぺーす
匿名名前空間
とくめい なまえくうかん
anonymous namespace
あのにます ねーむすぺーす

概要

無名名前空間を使用することで、名前空間を汚さずに、コーディングが可能です。 無名名前空間では、namespace キーワードに「名前空間の名前」を指示せずに使用することで表記します。

namespace {
	int bar;
	void foo() {
		cout << "Hoge" << endl;
	}
}


unnamed_namespace1.cpp 無名名前空間の例

ソースコード unnamed_namespace1.cpp

/*
 * unnamed_namespace1.cpp
 * Copyright (C) 2014 kaoru <kaoru@bsd>
 */
 
#include <iostream>
#include <cstdlib>
 
namespace {
        void foo () {
                std::cout << "Hello" << std::endl;
        }
}
 
int main(int argc, char const* argv[])
{
        foo();
        return 0;
}

コンパイル

c++  unnamed_namespace1.cpp -o unnamed_namespace1

実行例

% ./unnamed_namespace1
Hello

他のファイルから参照できない例

func.cpp で unnamed_namespace1.cpp の foo()を参照しようとするとコンパイル時に当然エラーになります。

/*
 * func.cpp
 * Copyright (C) 2014 kaoru <kaoru@bsd>
 */
 
void foo ();
 
void func ()
{
        foo();
}
$ c++ unnamed_namespace1.cpp func.cpp
/tmp/func-qFrK1L.o: In function `func()':
func.cpp:(.text+0x5): undefined reference to `foo()'
c++: error: linker command failed with exit code 1 (use -v to see invocation)

関連項目