質問に答えるには、「静的とは、ヘッダーが複数のソース ファイルに含まれている場合に、VAL のコピーが 1 つだけ作成されることを意味しますか?」...
いいえ。VAL は、ヘッダーを含むすべてのファイルで常に個別に定義されます。
この場合、C と C++ の標準によって違いが生じます。
C では、ファイル スコープの変数はデフォルトで extern です。C を使用している場合、VAL は static で、ANOTHER_VAL は extern です。
ヘッダーが異なるファイルに含まれている場合 (同じグローバル名が 2 回定義されている場合)、最新のリンカーは ANOTHER_VAL について文句を言う可能性があることに注意してください。ANOTHER_VAL が別のファイルで異なる値に初期化されている場合は間違いなく文句を言うでしょう。
C++ では、ファイル スコープの変数は、const の場合はデフォルトで static になり、そうでない場合はデフォルトで extern になります。C++ を使用している場合、VAL と ANOTHER_VAL は両方とも静的です。
また、両方の変数が const に指定されているという事実を考慮する必要があります。理想的には、コンパイラは常にこれらの変数をインライン化し、それらのストレージを含めないことを選択します。ストレージを割り当てることができる理由はたくさんあります。思いつくもの...
- デバッグ オプション
- ファイルに取得されたアドレス
- コンパイラは常にストレージを割り当てます (複雑な const 型は簡単にインライン化できないため、基本型の特殊なケースになります)