【发布时间】:2014-06-24 10:35:38
【问题描述】:
我有一个概念上的疑问,我会尝试用一个例子来表达:
main.cpp
#include "array_list.cpp"
int main()
{
array_list list1;
return 0;
}
场景 1: array_list.cpp->
class array_list
{
private:
int list[10];
public:
array_list () {};
~array_list () {};
void set_element (int,int);
};
void array_list::set_element (int i,int a) {
list[i] = a;
}
错误:
main.obj : error LNK2005: "public: void __thiscall array_list::set_element(int,int)" (?set_element@array_list@@QAEXHH@Z) 已在 array_list.obj 中定义 1>C:\Users\vrastog\Documents\Visual Studio 2012\Projects\C++ learning\Debug\list using arrays.exe:致命错误 LNK1169:找到一个或多个多重定义符号
场景 2: array_list.cpp->
class array_list
{
private:
int list[10];
public:
array_list () {};
~array_list () {};
void set_element (int i,int a) {
list[i] = a;
}
};
错误:没有错误!!
问题:我了解错误的原因。相同的方法已经定义了两次,一次在 main.obj 中,第二次在 array_list.obj 中,因此,它应该是一个错误。 我的问题是为什么第二种情况有效?在这里,由于我们在主文件中包含了 array_list.cpp,所以这里也应该定义了两次“set_element”。我在这里错过了什么?
【问题讨论】:
-
你到底为什么要包含
.cpp文件?!?这些不打算包含在内,而是单独编译并最终链接。 -
我知道它不应该被包含在一个好的编码实践中。但理论上是可以的。我想通过这个例子了解底层的编译问题。
-
Including .cpp files的可能重复
-
这个问题本质上是在问为什么一个内联函数可以被定义多次。
-
@Drew:没错!!
标签: c++ compilation linker inline redefinition