後者を導入するときに、C++が静的グローバル(内部リンケージ)と名前のない名前空間のシンボル(外部リンケージですが、外部から参照する方法がない)を区別したのはなぜですか?
これらの理由のいずれかはまだ有効ですか、それとも新しい理由がありますか?
それらがまだ異なる場所が残っていますか 匿名グローバル(または名前空間スコープ)ユニオンはstatic
でなければならないという任意のルール、およびそれらは何ですか?
ボーナスポイントについて、それらが異なる理由が残っていない場合、それらを同等にするリクエストはありますか?
C++が名前空間(C++ 98)、特に名前のない名前空間を導入したとき、静的グローバルは廃止され、熱狂的な新しいものよりも劣っていましたが、 C++ 11で元に戻されました :
静的キーワードの廃止…もうない?
C++ 11以前は、内部リンケージのあるシンボルはテンプレート引数として使用できませんでした: C++ 03がテンプレートパラメーターに外部リンケージを必要とするのはなぜですか?
これがすべての質問(またはそれらのいずれか)に答えるとは思いませんが、ファイルレベルの静的宣言と匿名の名前空間の主な違いは、名前空間は型にも適用されることです(static
type(変数を宣言するのと同じ意味)、それが名前空間が優先される理由です。そのため、ファイルスコープのデータと型を宣言するための単一のイディオムがあります。
例を挙げれば、次のコードは問題なくコンパイルできるはずです。 (両方のタイプを区別することはできませんが、許可されているため、あまり役に立ちません)
#include <iostream>
struct Foobar
{
int foo;
float bar;
};
namespace
{
struct Foobar
{
double baz;
};
} // namespace
int main()
{
std::cout << "HELLO!\n";
}