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