我有几个用于更新它们的源文件。他们拒绝编译的原因很明显(所有无趣的源代码都被剥离了):
// 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];
}
现在extern
in.cpp
是不必要的,但我只是想知道,有什么问题?有没有办法将正文放回头table_size()
文件以使其内联?
upd prime_list
和prime_table
是同一个对象。我在缩短这篇文章的来源时错误地更改了名称;现在修好了。