0

それらを更新するためのソースファイルがいくつかあります。彼らは非常に明白な理由でコンパイルを拒否しています (興味のないソースはすべて削除されています):

// 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_listHashSet::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_listprime_table同じオブジェクトです。この投稿のソースを短くしているときに、誤って名前を変更しました。今修正されました。

4

2 に答える 2

0

外部を削除します。大丈夫です。

メソッドをヘッダー ファイルに配置するには、ヘッダー ファイルで extern を使用して配列を宣言するだけです。

 extern const unsigned long prime_table [];

また、 prime_table が原因でエラーが発生していませんが、num_primes.

私にとって完璧に機能します。

プロジェクト tmpCheck の構成デバッグのビルド **

make all ビルドファイル: ../src/hashset.cpp 呼び出し: GCC C++ Compiler g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/hashset.d" -MT"src /hashset.d" -o "src/hashset.o" "../src/hashset.cpp" ビルド完了: ../src/hashset.cpp

ファイルの構築: ../src/tmpCheck.cpp 呼び出し: GCC C++ コンパイラ g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/tmpCheck.d" -MT"src/tmpCheck .d" -o "src/tmpCheck.o" "../src/tmpCheck.cpp" ビルド完了: ../src/tmpCheck.cpp

ビルド ターゲット: tmpCheck 呼び出し: GCC C++ リンカー g++ -o "tmpCheck" ./src/hashset.o ./src/tmpCheck.o
ビルド ターゲット: tmpCheck

ビルド完了 **

 #ifndef HASHSET_H_
 #define HASHSET_H_

  extern const unsigned long prime_list [];
  // hashset.h
  class HashSet {
     unsigned prime ; // Index to table size (c++11 syntax)
   public:
      HashSet():prime(0){
        //
      }
      unsigned long table_size () const { return prime_list [prime]; }

  };
  #endif /* HASHSET_H_ */

   #include "hashset.h"
   //hashet.cpp
   const unsigned long prime_list [] = {53, 97, 193, 389, 769,
      1543, 3079, 6151, 12289, 24593, 49157, 98317};
于 2013-03-03T09:08:54.317 に答える
0

@Adnan Akbar によって提案された extern 指定子の使用で問題が解決しない場合は、ヘッダー ファイルが複数含まれていることが原因である可能性があります
その場合、問題に対する簡単な解決策があり ます。「hashset.h」で
条件付き変換ディレクティブまたは#pragma once を使用します。

于 2013-03-03T17:45:04.237 に答える