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_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

正如我发现的那样,实际上 if 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我就没有错误。为什么会这样?我只有这个数组的一个定义,我不会以任何方式将它暴露给我的其他源文件(我现在不放在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];
}

现在externin.cpp是不必要的,但我只是想知道,有什么问题?有没有办法将正文放回头table_size()文件以使其内联?

upd prime_listprime_table是同一个对象。我在缩短这篇文章的来源时错误地更改了名称;现在修好了。

4

2 回答 2

0

我认为,如果@Adnan Akbar 建议的外部规范的使用没有解决您的问题,那么它可能是由多次包含头文件引起的
因此,在这种情况下,有一个简单的解决方案可以解决您的问题: 在“hashset.h”中
使用条件翻译指令或#pragma once

于 2013-03-03T17:45:04.237 回答
0

删除外部。应该没问题。

要将方法放到头文件中,只需在头文件中使用 extern 声明数组即可。

 extern const unsigned long prime_table [];

此外,由于 prime_table ,您没有收到错误,而是 num_primes。

非常适合我。

构建项目 tmpCheck 的配置调试 **

生成所有构建文件:../src/hashset.cpp 调用:GCC C++ 编译器 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++ Linker 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 回答