2012-05-31 3 views
16

匿名の名前空間で定義されているシンボル(関数と変数)は、staticキーワードのように内部リンケージを使用しないのはなぜですか?関数が外部から見える/アクセスできない場合、外部リンケージを持つ理由は何ですか?匿名名前空間内の関数/オブジェクトに外部リンケージがあるのはなぜですか?

+0

** **外部リンケージはありませんが、内部にはありません。あなたのソースは何ですか? –

+3

おそらくC++ 03標準です。 –

+0

@SteveJessop匿名の名前空間もC++ 03に存在し、内部のリンケージを提供します。 –

答えて

37

C++ 03では、内部リンケージを持つ名前はテンプレート引数[*]として使用できませんでした。したがって、名前のない名前空間にあるほとんどのものの名前には、テンプレートでの使用を可能にするための外部リンケージがありました。名前のない名前空間で名前の内部リンケージを明示的に指定するには、名前付きまたはグローバル名前空間と同じstaticを宣言します。

名前が変更された名前空間の名前は、デフォルトで内部リンケージ(3.5/4)を持ち、内部リンケージを持つ名前をテンプレート引数として使用できます。

[*]タイプの場合、外部リンクが必要です。オブジェクトや関数の場合は、のアドレスがの場合は外部のリンケージが必要ですが、テンプレートの引数としての値の内部リンケージを使用することはOKです。

+3

+1、してください、内部結合がデフォルトであると言うC++ 11標準の段落番号を回答に追加できますか? – Klaim

関連する問題