标题: C语言extern问题 不太明白请教下大家 [打印本页]

作者: ty86391101    时间: 2022-1-22 17:10
标题: C语言extern问题 不太明白请教下大家
本帖最后由 ty86391101 于 2022-1-22 18:46 编辑

这个是tftled.c

下面的是tftled.h
这个是 main.c

想问下 编译的时候 这个数组和变量i 都需要加上 extern 才行,
为什么头文件里,函数sum不需要前面加extern?


(函数没什么意义 随便写的)

作者: 188610329    时间: 2022-1-22 18:04
extern  是引用外部已经声明的变量
通常是在一个项目中引用另一个 C 文件声明的变量,所以理论上这个 .h 文件应该是被另一个 C文件 include 而不是被这个 C文件 include, 感觉上,这几个文件,被不同的人修改过,而修改的人也是半吊子。
作者: 13205495918    时间: 2022-1-22 18:33
沙发正解
作者: ty86391101    时间: 2022-1-22 18:42
188610329 发表于 2022-1-22 18:04
extern  是引用外部已经声明的变量
通常是在一个项目中引用另一个 C 文件声明的变量,所以理论上这个 .h  ...

我修改一下哦,是没给写全  确实是别的函数去调用的
作者: rundstedt    时间: 2022-1-22 19:27
不加extern是定义变量,一个名字的全局变量在工程里面只能定义一次。加了extern是声明变量,告诉c源码别的文件定义了一个什么类型的变量,当然可以在除了定义这个变量的c文件以外的任意c文件里面声明变量,不管用没用到。

函数原型声明,原理同上。所以不需要加extern。
作者: ty86391101    时间: 2022-1-22 21:08
发表于 2022-1-22 19:27
不加extern是定义变量,一个名字的全局变量在工程里面只能定义一次。加了extern是声明变量,告诉c源码别的 ...

是不是编译器默认的每个函数都是extern类型的啊?
所以函数不用加extern啊?
作者: rundstedt    时间: 2022-1-22 21:21
ty86391101 发表于 2022-1-22 21:08
是不是编译器默认的每个函数都是extern类型的啊?
所以函数不用加extern啊?

函数声明只是声明有这个东西,入口参数和出口参数都是什么样子的,当然可以每个c文件里面声明。

类似函数声明的变量的写法是定义,定义这个变量,比如int i;是定义i这个int型变量,你要在多个c文件里面定义,那么连接的时候,连接器就不知道该用哪个i,就乱套了。

extern int i;才是变量声明,声明其他c文件定义的i变量。
作者: rundstedt    时间: 2022-1-22 21:23
补充一下,可以在多个c文件里面定义static int i;但是每个文件里面的i都是自己文件的,你永远无法访问其他c文件里面的i,只能访问自己文件里面的那个。
作者: ty86391101    时间: 2022-1-22 22:06
发表于 2022-1-22 21:21
函数声明只是声明有这个东西,入口参数和出口参数都是什么样子的,当然可以每个c文件里面声明。

类似 ...

嗯,我的矛盾点在于 你看啊

tftled.h这个头文件里面 声明的 变量和函数

在main.c这个文件使用 包含了tftled.h头文件(include"tftled.h")

那么 我在main.c这个文件里面 想用tftled.c里的变量 这个需要声明extern int i;到这边我都是知道。

那main.c要去用tftled.c里的函数的时候 不也得是extern u8 sum();声明一下吗?

他不加extern 光声明u8 sum(u8 a,u8 b); 也能找到tftled.c里的函数。不得是extern u8 sum(u8 a,u8 b);吗?
作者: rundstedt    时间: 2022-1-22 22:34
ty86391101 发表于 2022-1-22 22:06
嗯,我的矛盾点在于 你看啊

tftled.h这个头文件里面 声明的 变量和函数
  1. extern int i;
复制代码

这是声明一个变量;
  1. int sum(int, int);
复制代码

这是声明一个函数;
  1. int i;
复制代码

这是定义一个变量;
  1. int sum(int x,int y){
  2.   return x+y;
  3. }
复制代码

这是定义一个函数;

声明可以在任何用到的文件里面写,定义在整个工程里面只能写一次。
话已经说到这种程度还看不懂,我无能为力了。
作者: liuzx66    时间: 2022-1-22 23:09
这个你要理解作用域的概念,看看书上怎么说的吧




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