8

C++ では、関数を static で宣言すると、その名前は宣言/定義されたコンパイル ユニットにのみ存在することがわかっています。

static void MyFunction() {...}

また、匿名名前空間内で関数を宣言すると、その名前はローカル コンパイル ユニットにのみ存在します。

namespace
{
    void MyFunction() {...}
}

また、匿名名前空間内で static を使用できます。

namespace
{
    static void MyFunction() {...}
}

これらの定義に違いはありますか?

ありがとうございました

4

1 に答える 1

12

はい、違いがあります。

最初に、正確に言いましょう。衒学的なところまで言っても、名前はどこにでも存在します。違いは次のとおりです。

  • シンボルがstatic(名前空間スコープで) 宣言されている場合、内部リンケージがあります。つまり、別の翻訳単位の同じ名前が別のエンティティを参照することを意味します。

  • 名前のない名前空間は、翻訳単位に固有の名前を持つ名前空間を生成します。シンボルにはまだ外部リンケージがありますが (静的でない場合)、別の翻訳単位で名前を付ける方法はありません。

主な違いはテンプレートに関するものです。少なくとも C++11 までは (まだ確認していないかもしれませんが)、テンプレートのインスタンス化に使用されるエンティティには、外部リンケージが必要です。したがって、静的に宣言されたもの、または暗黙的に内部リンケージを持つものでテンプレートをインスタンス化することはできませんでした。

于 2013-05-31T19:45:25.457 に答える