我尝试按照规则组织项目,声明类 .h ,并在 .cpp 中定义它们。一切似乎都是正确的,我调用了一次 .h 文件,但这个错误一直是“已经在 ....obj 中定义”。我做了一个绝对原始的项目,有一个 .cpp 和 .h(以免从有几十个文件的项目中学习),但这里同样的东西是“已经在 ....obj 中定义的”。
#include <iostream>
#include "Source.h"
int main()
{
std::cout << &a;
}
//...Source.h
class oneee {
int strdr();
}a;
//...Source.cpp
#include "Source.h"
int oneee::strdr() {
return 299;
}
问题是什么?如果您直接在 .h 中执行实现,那么一切都很好。
错误 LNK1169:找到一个或多个已定义符号 DeclareImplement D:\MyVisualStudioProg\DeclareImplement\Debug\DeclareImplement.exe 1
如果你这样做(将所有内容插入 Source.h),那么一切都很好:
//......Source.h
class oneee {
int strdr();
}a;
int oneee::strdr() {
return 299;
}
事实上,#include 是一个预处理器,它实际上只是插入给定文件的内容(您甚至可以插入 *.txt),结果证明编译器实际上是给定的:
源.h
源码.cpp
原来,当cpp编译成obj的时候,那里已经有了“a”的定义。并且将 Source.h 连接到主文件时,它是重复的。
您可以通过将静态添加到 .h 来解决此问题
但这将在每个源中创建变量的副本,因此最好的方法是:
源.h
源码.cpp