找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1024|回复: 10
打印 上一主题 下一主题
收起左侧

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

[复制链接]
跳转到指定楼层
楼主
本帖最后由 ty86391101 于 2022-1-22 18:46 编辑

这个是tftled.c

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

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


(函数没什么意义 随便写的)
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶1 踩
回复

使用道具 举报

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

使用道具 举报

板凳
ID:908826 发表于 2022-1-22 18:33 | 只看该作者
沙发正解
回复

使用道具 举报

地板
ID:1000365 发表于 2022-1-22 18:42 | 只看该作者
188610329 发表于 2022-1-22 18:04
extern  是引用外部已经声明的变量
通常是在一个项目中引用另一个 C 文件声明的变量,所以理论上这个 .h  ...

我修改一下哦,是没给写全  确实是别的函数去调用的
回复

使用道具 举报

5#
ID:879809 发表于 2022-1-22 19:27 | 只看该作者
不加extern是定义变量,一个名字的全局变量在工程里面只能定义一次。加了extern是声明变量,告诉c源码别的文件定义了一个什么类型的变量,当然可以在除了定义这个变量的c文件以外的任意c文件里面声明变量,不管用没用到。

函数原型声明,原理同上。所以不需要加extern。
回复

使用道具 举报

6#
ID:1000365 发表于 2022-1-22 21:08 | 只看该作者
发表于 2022-1-22 19:27
不加extern是定义变量,一个名字的全局变量在工程里面只能定义一次。加了extern是声明变量,告诉c源码别的 ...

是不是编译器默认的每个函数都是extern类型的啊?
所以函数不用加extern啊?
回复

使用道具 举报

7#
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变量。
回复

使用道具 举报

8#
ID:879809 发表于 2022-1-22 21:23 | 只看该作者
补充一下,可以在多个c文件里面定义static int i;但是每个文件里面的i都是自己文件的,你永远无法访问其他c文件里面的i,只能访问自己文件里面的那个。
回复

使用道具 举报

9#
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);吗?
回复

使用道具 举报

10#
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. }
复制代码

这是定义一个函数;

声明可以在任何用到的文件里面写,定义在整个工程里面只能写一次。
话已经说到这种程度还看不懂,我无能为力了。
回复

使用道具 举报

11#
ID:160500 发表于 2022-1-22 23:09 | 只看该作者
这个你要理解作用域的概念,看看书上怎么说的吧
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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