extern 定义_声明和定义

e69ea0d4d6794a26ec00e6226fe7f971.gif

非得分清客观和主观,有时认为自己很客观,殊不知其实已经陷入主观中。对于我们,“一念”其实就已经是主观了,哪怕是认为的客观,其实还不是主观下的客观吗?
这篇谈下声明和定义两个概念。在我看来声明其实可以看成是主观的东西,而定义可以看出是客观的概念。有时候主观和客观又融合到一块,毕竟离开主观看客观是没有意义的,同样,离开客观一味追求主观,可能就是一种偏见了。 c语言中强调 声明(declaration) 和 定义(definition) 两个概念分开。毕竟在c的世界中,这本就是两个不同的东西,但又是相互联系的东西,故这里将其一块对比下。拿着镜子各自照下也许才更明白自己的位置。 首先说明,无论声明和定义到底有啥区别,都是再像编译器在说明强调一个东西,只是强调的东西不一样而已。声明是向编译器介绍名字(也就是自己的标识符),为啥要介绍呢?因为编译器有个作用是将用到的所有标识符进行统一注册(注册到一个符号表中---一个主观的表述),你不向编译器介绍自己的名字,可想而知,你压根就不会被编译器认识。注册到符号表中意味着“这个声明的变量或者函数在某处可以找到,它有什么属性?都有什么特点?”。而定义是像编译器说:“在这里建立一个这个标识符的变量”,“在这里建立一个这个标识符的函数”,而变量或者函数都是需要“地盘”的,就是需要存储空间,这时候这个地盘一并建立。编译器会在“定义点”为变量或者函数开辟真正的空间(客观)。 在c中,可以在不同的地方去声明变量,而定义只能存在一个地方。毕竟主观的声明可以多次,客观的占地盘,一个东西只能占据一块空间呢。就像一个客观存在的苹果(类似定义),同样这个客观的苹果,可以在多个人的脑袋中有个主观(声明)的苹果。这几个主观的苹果都会指向这个客观的苹果,如此而已。看图1所示代码:
#include int add(int a, int b); // 声明int main(){  int a = 2;  int b = 3;  int c = add(a, b);  printf("the sum is %d\n", c);  return 0;}int add(int a, int b) {  return a + b;}
图1 一个c语言代码 c语言中有句话:“先声明后使用”。这句话不仅说的是变量,也说的是函数。声明是注册,使用只有注册到符号表中的东西才能进一步使用,不然编译器会提示“找不到”,从而报错。 像图1中的int add(int a, int b); // 声明,就是对客观的函数进行了一次声明,这个声明就是将这条语句的标识符注册到符号表中,c语言编译是从上到下逐行进行编译的,遇到符号时候,会去符号表中看看此符号是否已经在符号表中注册了。因此在编译int c = add(a, b);这行语句时候,会看看add(int a, int b)这样的符号是不是已经存在了。这就是声明的作用: 提前告知编译器有用的信息! 而定义呢?当然是你不能光说不练吧,你既然向我注册了有用的信息,那信息具体的客观得有吧,不然就是“说大话了”,没啥意义了。因此声明的背后必有一个有用的定义呢。 再看int a = 2;这条语句,这里就是定义就是声明,声明就是定义啊,声明和定义进行了“你中有我,我中有你”的融合。例如:如果定义int a;之前,编译器并没有发现标识符x,编译器则把这一标识符看成是声明并立即为其分配存储空间。函数可不可这样呢?当然也可以,但大多数函数是独立存在的一部分,一般会写到main函数之外的地方,因此单独声明就显得有必要了,毕竟有时你在当前并不一定知道某个函数具体定义在哪呢! 那有没有只声明一个变量不定义一个变量呢?c语言当然有方法,就是extern int a;用了这个extern其实就是告诉编译器,这里仅仅是声明一个变量a,可不要给我分配存储空间呢!那extern可不可以放到函数声明前面呢,当然也可以,但这是不必要的,毕竟函数声明和定义一般就已经区分的很明确了,没必要再“画蛇添足”了。
6bc2552fa5332fe23157035389c1f59b.pngEND

1、c语言编译过程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值