web-dev-qa-db-ja.com

C ++の静的グローバルと匿名名前空間

  1. 後者を導入するときに、C++が静的グローバル(内部リンケージ)と名前のない名前空間のシンボル(外部リンケージですが、外部から参照する方法がない)を区別したのはなぜですか?

  2. これらの理由のいずれかはまだ有効ですか、それとも新しい理由がありますか?

  3. それらがまだ異なる場所が残っていますか 匿名グローバル(または名前空間スコープ)ユニオンはstatic でなければならないという任意のルール、およびそれらは何ですか?

  4. ボーナスポイントについて、それらが異なる理由が残っていない場合、それらを同等にするリクエストはありますか?


C++が名前空間(C++ 98)、特に名前のない名前空間を導入したとき、静的グローバルは廃止され、熱狂的な新しいものよりも劣っていましたが、 C++ 11で元に戻されました
静的キーワードの廃止…もうない?

C++ 11以前は、内部リンケージのあるシンボルはテンプレート引数として使用できませんでした: C++ 03がテンプレートパラメーターに外部リンケージを必要とするのはなぜですか?

11
Deduplicator

これがすべての質問(またはそれらのいずれか)に答えるとは思いませんが、ファイルレベルの静的宣言と匿名の名前空間の主な違いは、名前空間は型にも適用されることです(static type(変数を宣言するのと同じ意味)、それが名前空間が優先される理由です。そのため、ファイルスコープのデータと型を宣言するための単一のイディオムがあります。

例を挙げれば、次のコードは問題なくコンパイルできるはずです。 (両方のタイプを区別することはできませんが、許可されているため、あまり役に立ちません)

#include <iostream>

struct Foobar
{
    int   foo;
    float bar;
};

namespace
{

struct Foobar
{
    double baz;
};

} // namespace

int main()
{
    std::cout << "HELLO!\n";
}

ここでのライブテスト

3
glampert