标题: C语言声明函数时感觉加不加“extern”都可以啊?到底有什么区别 [打印本页]

作者: 昆明路口卖提莫    时间: 2018-8-31 22:23
标题: C语言声明函数时感觉加不加“extern”都可以啊?到底有什么区别

作者: angmall    时间: 2018-9-1 07:26
extern 是外部引用,如果是在同一个文件里,不需要,如果变量 或函数定义在另一个文件里才需要。你看看是不是这种情况。


作者: angmall    时间: 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;

作者: cccc888    时间: 2018-9-1 08:09
就是默认的static和extern属性问题,不同的编译器可能不同,最好阅读编译器特性文档。
也可以显式使用。

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

作者: 奔向大海    时间: 2018-9-1 10:30
在不同文件之间的调用时会有区别
作者: 昆明路口卖提莫    时间: 2018-9-1 11:02
angmall 发表于 2018-9-1 07:30
  有人想,既然是想两个文件都用,那就在common.h中声明一个unsigned char key,然后由于包含关系,在mai ...

明白了,谢谢
作者: zhaoyinlo    时间: 2018-9-1 11:59
extern  相当于声明一下  我要引用外部函数了  让编译器不要报错   
不加 相当于自己声明的函数  




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1