LNK2005,LNK1169
问题描述
在完成学校数据结构是实验课作业的时候,要求用多文件的形式完成作业,要求在list.h实现函数声明,list.cpp对函数进行具体定义,在main.cpp中进行调用
于是当我使用VS2017编写C++代码的时候,出现了
LNK2005,LNK1169报错
但是当时没有一个函数进行重定义
当时代码大概为
list.h
#include<stdio.h>
#include<malloc.h>
//结构类型
struct data
{
int i[20];
int length;
};
extern data;
int ListDelect(data *&L, int position, int &delectdata);
int Reverse(data *&L);
void CreatList(data* &L, int b[], int n);
void DestroyList(data* &L);
int ListInsert(data *&L, int position, int data);
list.cpp
#pragma once
#include"list.h"
//倒置
....省略函数具体定义
main.cpp
#include "list.cpp"
int main()
{
...
}
当时查询网上各种资料,比如忽略lib文件等方法
但是都没有解决问题
原因
大概原因是cpp文件不能直接include,因为会当在main.cpp文件中直接include .cpp文件会导致,重复调用某些库文件,而导致重定义的问题
但是当时由于数据结构题目要求,不能直接在.h文件里对进行定义,一直卡在那很久
后面在我朋友的指导下,才想出解决方法
解决方法
其实解决方法非常简单,只用将main.cpp中#include "list.cpp"
的引用
改为对#include "list.h"
的引用,就可以了
最开始我也有这个疑问,因为list.h文件中并没有对函数的具体定义,为什么可以直接调用。
大佬给我的解释是,当list.cpp中#include "list.h"
后,list.cpp和list.h就已经完成了链接了。
当main.cpp中需要调用list.h的定义的函数时,由于list.h文件中没有对函数的定义时
list.h就会自动寻找,与他已经相链接的文件中,查找相关函数的定义,直到所有链接的文件全部查找结束或者找到了函数的定义为止
所以,即使list.h没有调用list.cpp文件,也能找到相关的定义
PS:这也证明了学习编程语言的时候基础一定要牢固~