找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

C语言extern问题 不太明白请教下大家

查看数: 1516 | 评论数: 10 | 收藏 1
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2022-1-22 17:10

正文摘要:

本帖最后由 ty86391101 于 2022-1-22 18:46 编辑 这个是tftled.c 想问下 编译的时候 这个数组和变量i 都需要加上 extern 才行, 为什么头文件里,函数sum不需要前面加extern? (函数没什么意义 随便 ...

回复

ID:160500 发表于 2022-1-22 23:09
这个你要理解作用域的概念,看看书上怎么说的吧
ID:879809 发表于 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. }
复制代码

这是定义一个函数;

声明可以在任何用到的文件里面写,定义在整个工程里面只能写一次。
话已经说到这种程度还看不懂,我无能为力了。
ID:1000365 发表于 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);吗?
ID:879809 发表于 2022-1-22 21:23
补充一下,可以在多个c文件里面定义static int i;但是每个文件里面的i都是自己文件的,你永远无法访问其他c文件里面的i,只能访问自己文件里面的那个。
ID:879809 发表于 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变量。
ID:1000365 发表于 2022-1-22 21:08
发表于 2022-1-22 19:27
不加extern是定义变量,一个名字的全局变量在工程里面只能定义一次。加了extern是声明变量,告诉c源码别的 ...

是不是编译器默认的每个函数都是extern类型的啊?
所以函数不用加extern啊?
ID:879809 发表于 2022-1-22 19:27
不加extern是定义变量,一个名字的全局变量在工程里面只能定义一次。加了extern是声明变量,告诉c源码别的文件定义了一个什么类型的变量,当然可以在除了定义这个变量的c文件以外的任意c文件里面声明变量,不管用没用到。

函数原型声明,原理同上。所以不需要加extern。
ID:1000365 发表于 2022-1-22 18:42
188610329 发表于 2022-1-22 18:04
extern  是引用外部已经声明的变量
通常是在一个项目中引用另一个 C 文件声明的变量,所以理论上这个 .h  ...

我修改一下哦,是没给写全  确实是别的函数去调用的
ID:908826 发表于 2022-1-22 18:33
沙发正解
ID:624769 发表于 2022-1-22 18:04
extern  是引用外部已经声明的变量
通常是在一个项目中引用另一个 C 文件声明的变量,所以理论上这个 .h 文件应该是被另一个 C文件 include 而不是被这个 C文件 include, 感觉上,这几个文件,被不同的人修改过,而修改的人也是半吊子。

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

Powered by 单片机教程网

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