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


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

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

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

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


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

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


「準拠する実装」のビットを除いて、あなたはほとんどあなた自身の質問に答えたようです。おそらく、後半を削除して、代わりに回答として投稿することを検討する必要がありますか?それとも、ここでまだ答えられていない何かがありますか?
カイルストランド

@KyleStrandはすべてを再定式化しました。
Deduplicator

回答:


3

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

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

#include <iostream>

struct Foobar
{
    int   foo;
    float bar;
};

namespace
{

struct Foobar
{
    double baz;
};

} // namespace

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

ここでライブテスト


main関数でFoobarを使用しないため、コンパイルされます。
dshil

さらに重要なことに、別の.cppファイルが独自のバージョンのを宣言するとstruct Foobarどうなりますか?さらに悪いことに、今だとしましょうclass Foobar。両方のコンストラクタを作成する方法を考えてください。
dgnuff
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.