找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7540|回复: 6
收起左侧

C语言声明函数时感觉加不加“extern”都可以啊?到底有什么区别

[复制链接]
ID:367460 发表于 2018-8-31 22:23 | 显示全部楼层 |阅读模式

函数声明

函数声明
回复

使用道具 举报

ID:155507 发表于 2018-9-1 07:26 | 显示全部楼层
extern 是外部引用,如果是在同一个文件里,不需要,如果变量 或函数定义在另一个文件里才需要。你看看是不是这种情况。

回复

使用道具 举报

ID:155507 发表于 2018-9-1 07:30 | 显示全部楼层
  有人想,既然是想两个文件都用,那就在common.h中声明一个unsigned char key,然后由于包含关系,在main.c和common.c中都是可见的,所以就能共用了。

  这种想法其实是很多初学者都会想到的,想起来确实有道理,但是实际写出来,我们发现编译的时候编译器提示出错,一般提示大概都类似于:Error: L6200E: Symbol key multiply defined (by common.o and main.o). 也就是说编译器认为我们重复定义了key这个变量。这是因为#include命令就是原封不同的把头文件中的内容搬到#include的位置,所以相当于main.c和common.c中都执行了一次unsigned char key,而C语言中全局变量是项目内(或者叫工程内)可见的,这样就造成了一个项目中两个变量key,编译器就认为是重复定义。

  正确的解决办法:使用extern关键字来声明变量为外部变量。具体说就是在其中一个c文件中定义一个全局变量key,然后在另一个要使用key这个变量的c文件中使用extern关键字声明一次,说明这个变量为外部变量,是在其他的c文件中定义的全局变量。请注意我这里的用词:定义和声明。例如在main.c文件中定义变量key,在common.c文件中声明key变量为外部变量,这样这两个文件中就能共享这个变量key了,如下图所示。

  代码如下(只写跟我们所说问题有关的部分):

  (1)main.c文件

 #include "common.h"
  unsigned char key;

  (2)common.c文件:

 #include "common.h"
  extern unsigned char key;

评分

参与人数 2黑币 +17 收起 理由
凌净清河 + 12
昆明路口卖提莫 + 5 赞一个!

查看全部评分

回复

使用道具 举报

ID:258566 发表于 2018-9-1 08:09 | 显示全部楼层
就是默认的static和extern属性问题,不同的编译器可能不同,最好阅读编译器特性文档。
也可以显式使用。

extern用来声明,但是带extern并赋予初值的不是声明。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:387318 发表于 2018-9-1 10:30 | 显示全部楼层
在不同文件之间的调用时会有区别

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:367460 发表于 2018-9-1 11:02 | 显示全部楼层
angmall 发表于 2018-9-1 07:30
  有人想,既然是想两个文件都用,那就在common.h中声明一个unsigned char key,然后由于包含关系,在mai ...

明白了,谢谢
回复

使用道具 举报

ID:390775 发表于 2018-9-1 11:59 | 显示全部楼层
extern  相当于声明一下  我要引用外部函数了  让编译器不要报错   
不加 相当于自己声明的函数  
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表