11

重複の可能性:
名前空間/匿名名前空間と静的関数

これは完全に冗長ですか、それともこれを行う理由があるのでしょうか?

namespace {
  static void f() {
    ...
  }
}
4

1 に答える 1

4

私には冗長に見えます-静的に宣言されているか、匿名の名前空間にあるということは、内部リンケージがあることを意味します。

§3.5/3:

名前空間スコープ (3.3.6) を持つ名前には、次の名前の場合、内部リンケージがあります。
— 明示的に static と宣言された変数、関数、または関数テンプレート。

§3.5/4:

[...] 名前のない名前空間、または名前のない名前空間内で直接的または間接的に宣言された名前空間には、内部リンケージがあります。[...] 上記の内部リンケージが与えられていない名前空間スコープを持つ名前は
、変数の名前である場合、囲んでいる名前空間と同じリンケージを持ちます。または
— 関数; また

したがって、現時点では、明示的に static と宣言されているため、内部リンケージがあります。静的として明示的に宣言されていない場合、名前のない名前空間内で宣言されているため、内部リンケージがあります。どちらでも同じ効果。

ここでは関数について具体的に返信していることに注意してください-型の名前(クラス/構造体/共用体など)を扱っているときに違いがあるというあいまいなケースがいくつかありますが、わかりません関数の場合に適用されるそのようなものの。

内部リンケージが実際に何を意味するかについては、標準が実際に非常に直接的で明確な場所の 1 つです。3 つの可能性すべての定義を引用するのがおそらく最善です (§3.5/2):

  1. 名前に外部リンクがある場合、それが示すエンティティは、他の翻訳単位のスコープまたは同じ翻訳単位の他のスコープからの名前で参照できます。
  2. 名前に内部リンケージがある場合、それが示すエンティティは、同じ翻訳単位内の他のスコープからの名前で参照できます。
  3. 名前にリンケージがない場合、それが示すエンティティは、他のスコープからの名前で参照できません。

上記のイタリック体は標準のものと一致していることに注意してください。これは、これらの文が標準の残りの部分全体でこれらのフレーズの意味を定義していることを示す方法です。

于 2012-12-02T21:19:22.877 に答える