それらを更新するためのソースファイルがいくつかあります。彼らは非常に明白な理由でコンパイルを拒否しています (興味のないソースはすべて削除されています):
// hashset.h
class HashSet {
unsigned prime = 0; // Index to table size (c++11 syntax)
unsigned long table_size () const { return prime_list [prime]; }
};
//hashet.cpp
const unsigned long prime_list [] = {53, 97, 193, 389, 769,
1543, 3079, 6151, 12289, 24593, 49157, 98317};
prime_list
HashSet::table_size
ヘッダーから呼び出された場合は未定義です。extern const unsigned long prime_list [];
ヘッダーとextern
この配列定義に追加して、ソースを修正しようとしました。make clean && make
私が得た後
g++ main.o dictionary.o hashset.o -o spell
dictionary.o:(.rodata+0x4): multiple definition of `num_primes'
main.o:(.rodata+0x4): first defined here
dictionary.o:(.rodata+0x20): multiple definition of `prime_list'
main.o:(.rodata+0x20): first defined here
hashset.o:(.rodata+0x4): multiple definition of `num_primes'
main.o:(.rodata+0x4): first defined here
hashset.o:(.rodata+0x20): multiple definition of `prime_list'
main.o:(.rodata+0x20): first defined here
collect2: error: ld returned 1 exit status
私が知ったように、実際には justprime_table
が次のように定義されている場合
// hashset.cpp
extern const unsigned long prime_list [] = {53, 97, 193, 389, 769,
1543, 3079, 6151, 12289, 24593, 49157, 98317};
の本体が(コンパイル エラーを回避するために)table_size ()
に移動されるhashset.cpp
と、これらのリンカー エラーが発生します。なしextern
ではエラーはありません。なぜそうなのですか?この配列の定義は 1 つしかありません。他のソース ファイルには一切公開しません (extern const unsigned long prime_list [];
今はヘッダーに追加しません)。どのように複数定義できますか?
明確にするために、私の情報源は次のとおりです。
// hashset.h
class HashSet {
unsigned prime = 0; // Index to table size (c++11 syntax)
unsigned long table_size () const;
};
//hashet.cpp
extern const unsigned long prime_list [] = {53, 97, 193, 389, 769,
1543, 3079, 6151, 12289, 24593, 49157, 98317};
unsigned long HashSet::table_size () const {
return prime_list [prime];
}
今extern
で.cpp
は不要ですが、どうしたのだろうか?また、本文をヘッダー ファイルに戻してtable_size()
インラインにできるようにする方法はありますか?
upd prime_list
とprime_table
同じオブジェクトです。この投稿のソースを短くしているときに、誤って名前を変更しました。今修正されました。