グローバル変数とオブジェクトに静的な保存期間と外部リンケージがある場合は?
関数には静的ストレージ期間と外部リンケージもありますか?
構造体とクラスと列挙子(私が知っている外部リンケージがあります)/ユニオンはどうですか?
ストレージ期間もリンケージもないと考えましたが、(グローバル)関数にはデフォルトで外部リンケージがあると思いましたが、クラススコープを持つクラスでは内部リンケージがありますか?
グローバル変数とオブジェクトに静的な保存期間と外部リンケージがある場合は?
関数には静的ストレージ期間と外部リンケージもありますか?
構造体とクラスと列挙子(私が知っている外部リンケージがあります)/ユニオンはどうですか?
ストレージ期間もリンケージもないと考えましたが、(グローバル)関数にはデフォルトで外部リンケージがあると思いましたが、クラススコープを持つクラスでは内部リンケージがありますか?
保存期間とリンケージは無関係な概念です。
関数はストレージに存在しないため、関数には「ストレージ期間」がありません。保存期間があるのはオブジェクトのみです。型はストレージにも存在しないため、型に保存期間がありません。
一般に、クラスにリンケージがないと言うのは正しくありません。名前空間スコープで宣言された名前付きクラスには、外部リンケージがあります。外部リンケージを持つクラスのメンバー関数にも外部リンケージがあります。ローカルに宣言されたクラスと名前のないクラスにはリンケージがありません。
関数には公式には保存期間がありませんが、本質的には静的です (つまり、すべての関数はプログラムの全期間にわたって存在します)。それらを定義した場合、static
または匿名の名前空間内で定義した場合は内部リンケージがあり、それ以外の場合は外部リンケージがあります。
ストレージ クラスは、クラス、構造体、共用体などの型定義ではなく、オブジェクトに適用されます。同じクラスの 2 つのオブジェクトが存在することはよくあることです。1 つは静的ストレージ期間で、もう 1 つは自動ストレージ期間です。
同様に、内部リンケージを持つ 1 つのオブジェクトと外部リンケージを持つ別のオブジェクトを作成できます。
T x;
static T y;
同じことがクラスのリンケージにも当てはまります。
class X { }; // external linkage
namespace {
class Y {}; // internal linkage
};