実際、関数スコープでは「リンケージなし」です。
目標は有効期間の管理です。静的にはグローバル静的の有効期間がありますが、ローカルの可視性(スコープ) があります。
ノート
C++ では、スタティック (「グローバル」) を匿名の名前空間で囲むことにより、リンケージなしで宣言することもできます。このトリックは、ヘッダーのみのライブラリで一般的に使用されます。
namespace /*anon*/
{
void foo() {} // only in this translation unit
int answer = 42; // this too
}
を使用するとどうなりますextern
か?
extern を使用する場合、宣言はextern
宣言のみです (何も定義されていません)。そのため、通常、定義により外部リンケージが期待されます-別の翻訳単位で定義されています。(そのため、グローバル スコープで宣言された場合と同じように動作します)。これは、ローカル関数の宣言に似ています。
int main()
{
void exit(int); // equivalent to non-local declaration
}
2.
あなたの例では、変数i
はすでに宣言されstatic
ているため、外部リンケージを取得しないことに注意してください。ただし、リンカーの競合なしで別の翻訳単位で宣言される可能性があります。