最最最通俗易懂地讲明白声明与定义的区别

前言

众所周知啊,对每一个刚学计算机的同学(包含作者)来说,声明与定义都没什么区别,甚至不知道为什么要区分好声明与定义,这篇文章就来讲讲,两者的区别与各自的作用。

PS:
由于作者的知识水平有限,不会深入本质的讲解,只是希望用更通俗易懂的、更快速能被使用的方式去解释。
文章内容可能存在错误,请各位读者自行结合实践判准(毕竟只有实现才是检验真理的唯一标准),也欢迎在评论区讨论与指正。

如果你认为这篇文章帮助到你的话记得点赞收藏评论关注分享。

正文

为什么要搞清楚声明和定义的区别

先说结论:(结论挺蠢的)
因为对于多份源文件或头文件来说,混淆声明与定义会报错。

对于一个新手(比如作者)来说,代码就只有短短的百行左右,根本不需要分多个文件来写,在一个文件中以下两种写法其实没什么区别,对吧?

//写法一
#include<iostream>
using namespace std;
int sum(int a, int b) {
	return a + b;
}
int main() {
	int sum(int a,int b);
	int a = 1, b = 2;
	cout << sum(a, b);
}

//写法二
#include<iostream>
using namespace std;
int sum(int a, int b) ;
int main() {
	int sum(int a,int b);
	int a = 1, b = 2;
	cout << sum(a, b);
}
int sum(int a, int b) {
	return a + b;
}

但如果说我想把他们写到两个不同的文件呢?
难道说我要把文件1的内容复制到文件2里?

//源文件1
int sum(int a, int b) {
	return a + b;
}
//源文件2
#include<iostream>
using namespace std;
int sum(int a, int b) {
	return a + b;
}
int main() {
	int sum(int a,int b);
	int a = 1, b = 2;
	cout << sum(a, b);
}

​

然后就报错了,报的LNK1169:找到一个或多个重定义符号。

那为什么会报错呢,接着往下看。

声明与定义的区别

先说结论:

定义需要为函数或变量分配一个新的内存地址,而声明不需要,声明只是告诉电脑,有这个函数或变量存在,已经分配过内存地址了,你自己去找找吧。

这也就导致了,如果重复定义一个相同的函数,电脑不知道从哪个内存地址调用函数,所以就报错了。

为什么对一个源文件来说,定义和声明没太大区别呢?
也就是上面第一段代码例子为什么没区别呢?

因为对于只有一个源文件的项目来说,电脑看到一个函数会自动往上查找,所以只要前文有过定义,和前文有过声明没太大区别。

那为什么对多个源文件来说就有区别呢?

这时候就不得不提到程序的编译与链接,如果你懒得看,你只需要知道的是,电脑很聪明也很笨,对于一个源文件来说,电脑看到一个函数,他只会往前文查找,不会去找其他文件里有没有这个函数。而如果你定义了两个相同的函数呢,又会让电脑不知道从哪个地址调用函数,所以需要声明。此时声明就是告诉电脑,我已经定义过这个函数了,你在前文找不到就往后文找找,或者去其他源文件里找找。

例子

对于main函数所在的文件来说,电脑看见sum这个没见过的函数,他就会往上查找,看到声明,他就知道其他文件里会有sum这个函数,他就会去到其他文件(源2)找到sum函数。

//源1.cpp
#include<iostream>
using namespace std;
int sum(int, int);//这是声明
int main() {
	int a = 1, b = 2;
	cout << sum(a, b);
	return 0;
}

//源2.cpp
//这下面的是定义
int sum(int a, int b) {
	return a + b;
}

看到这里其实你就把声明与定义最表面的东西学完了(很简短对吧),如果对你有帮助的话记得留下你的点赞关注与收藏分享,如果有任何疑问、建议或是想攻击作者欢迎评论与私信。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值