次のように、最初の 10 個の素数を格納する配列があるとします。
const int primes[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29};
1 つの .cpp ファイルがある限り、これはすべて非常に問題なくシンプルです。ただし、複数の .cpp ファイルがある場合、この配列をどこに配置すればよいかわかりません。
明らかな解決策は次のとおりです。
// primes.h:
extern const int primes[10];
// primes.cpp:
extern const int primes[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29};
ただし、これの問題は、素数配列がコンパイル時の定数ではなくなったことです。x.cpp が素数 [k] を含むいくつかの重い計算を実行したいとします。コンパイル時定数は ka で、実際のメモリ ルックアップを実行する必要があります。私はそれが好きではありません。
では、次のようにこの配列をどこに配置すればよいでしょうか。
- バイナリで 1 回だけです (.cpp ファイルごとに 1 回ではありません)。
- array[SOME_CONSTANT] もコンパイル時の定数です
編集
これはどう?
inline int prime(int i) {
static const int primes[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29};
return primes[i];
}
PS:上記の「明白な解決策」でさえ、書くのにかなりの時間がかかりました。どうやら const 変数にはデフォルトで内部リンクがあるようです。そのため、「extern」を primes.cpp ファイルに追加して機能させる必要がありました。