OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 10476|回复: 61

菜鸟越来越菜:关于extren用法的求助

[复制链接]

16

主题

197

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
457
金钱
457
注册时间
2012-4-20
在线时间
91 小时
发表于 2016-10-27 16:44:41 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 ba5rw 于 2016-10-27 17:36 编辑

我在a.h中写了:
extern  u8 abc;
在a.c中用了
u8 abc;
abc=88;
然后main.c包含了a.h
然后在main.c中用到:

n=abc;

编译提示: Error: L6218E: Undefined symbol abc (referred from main.o).
编译无法通过……对照了,原子老师相关帖子和网络其他帖子,感觉没有错,但是就是无法编译通过……

jermy_z去掉“”[url=]查看完整内容[请看2#楼]
[/url]LZ要加强C了。 “extern abc;”改成“extern u8 abc;”“”最佳答案,我问题还没解决呢!谢谢了!

最佳答案

查看完整内容[请看2#楼]

LZ要加强C了。 “extern abc;”改成“extern u8 abc;”
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

26

主题

280

帖子

1

精华

高级会员

Rank: 4

积分
908
金钱
908
注册时间
2013-8-2
在线时间
279 小时
发表于 2016-10-27 16:44:42 | 显示全部楼层
LZ要加强C了。
“extern  abc;”改成“extern u8 abc;”
博客:http://blog.csdn.net/feilusia
CC2541群(127442605);CC2640群(557278427);
Android群(541462902);STM8/STM32群(164311667);
Linux群(512598061);职场交流群(450154342);
回复

使用道具 举报

33

主题

984

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8017
金钱
8017
注册时间
2014-8-13
在线时间
1594 小时
发表于 2016-10-27 16:47:26 | 显示全部楼层
main.c中添加#include "a.h"
回复

使用道具 举报

15

主题

184

帖子

0

精华

高级会员

Rank: 4

积分
647
金钱
647
注册时间
2014-4-29
在线时间
299 小时
发表于 2016-10-27 16:52:27 | 显示全部楼层
Error: L6218E: Undefined symbol abc (referred from main.o).
这个报错的意思是
在keil界面左侧的project栏,需要把a.c这个源文件添加到你的工程里面
回复

使用道具 举报

16

主题

197

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
457
金钱
457
注册时间
2012-4-20
在线时间
91 小时
 楼主| 发表于 2016-10-27 16:55:40 | 显示全部楼层
xianshasaman 发表于 2016-10-27 16:52
Error: L6218E: Undefined symbol abc (referred from main.o).
这个报错的意思是
在keil界面左侧的proje ...

已经添加了啊,已经用manage project itm……添加在user里头了。这是首先就要查找的问题,但是还是报错。
回复

使用道具 举报

16

主题

197

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
457
金钱
457
注册时间
2012-4-20
在线时间
91 小时
 楼主| 发表于 2016-10-27 16:56:08 | 显示全部楼层
mack13013 发表于 2016-10-27 16:47
main.c中添加#include "a.h"

上面说了,已经添加
回复

使用道具 举报

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2775
金钱
2775
注册时间
2015-6-1
在线时间
394 小时
发表于 2016-10-27 16:59:00 | 显示全部楼层
兄弟,原子的例程不会在extern后面不加类型的。。。extern u8 abc
自在随心
回复

使用道具 举报

16

主题

197

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
457
金钱
457
注册时间
2012-4-20
在线时间
91 小时
 楼主| 发表于 2016-10-27 17:03:42 | 显示全部楼层
feilusia 发表于 2016-10-27 16:44
LZ要加强C了。
“extern  abc;”改成“extern u8 abc;”

是我手误,我本来就就是写extern u8 abc的。就是出错的,已经研究一个下午了,晕了……
回复

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13102
金钱
13102
注册时间
2012-11-26
在线时间
3811 小时
发表于 2016-10-27 17:05:11 | 显示全部楼层
ba5rw 发表于 2016-10-27 17:03
是我手误,我本来就就是写extern u8 abc的。就是出错的,已经研究一个下午了,晕了……

上工程  
学无止境
回复

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13102
金钱
13102
注册时间
2012-11-26
在线时间
3811 小时
发表于 2016-10-27 17:05:35 | 显示全部楼层
你这样子描述的问题,也许不是你说的问题,直接上工程代码
学无止境
回复

使用道具 举报

16

主题

197

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
457
金钱
457
注册时间
2012-4-20
在线时间
91 小时
 楼主| 发表于 2016-10-27 17:14:52 | 显示全部楼层
本帖最后由 ba5rw 于 2016-10-27 17:20 编辑

a.h文件:

#ifndef __A_H
#define __A_H                           
#include "stm32f10x.h"

extern u8 abc;

void a();


#endif

a.c文件:
void a(void)
{
   u8 abc=88;
}

main.c文件

#include "stm32f10x.h"
#include "delay.h"
#include "sys.h"
#include "a.h"

int main()
{
   u8 n;
   n=abc;
}
编译后就出错,只要main里头屏蔽n=abc就通过。

工程里头该加的文件都加了,使用mdk5.
回复

使用道具 举报

15

主题

184

帖子

0

精华

高级会员

Rank: 4

积分
647
金钱
647
注册时间
2014-4-29
在线时间
299 小时
发表于 2016-10-27 17:20:44 | 显示全部楼层
你在函数内部定义了一个局部变量,然后当做全局变量用,肯定不行啊
你应该在函数外面定义成全局变量
回复

使用道具 举报

16

主题

197

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
457
金钱
457
注册时间
2012-4-20
在线时间
91 小时
 楼主| 发表于 2016-10-27 17:23:47 | 显示全部楼层
xianshasaman 发表于 2016-10-27 17:20
你在函数内部定义了一个局部变量,然后当做全局变量用,肯定不行啊
你应该在函数外面定义成全局变量

奇怪的是我在另一个学习案例中这样用是可以的。而且我看了原子老师的相关回答也是这样的。应该叫外部引用某个函数的变量吧。不知道自己在哪一步出问题,非常困惑。
回复

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13102
金钱
13102
注册时间
2012-11-26
在线时间
3811 小时
发表于 2016-10-27 17:26:57 | 显示全部楼层
ba5rw 发表于 2016-10-27 17:23
奇怪的是我在另一个学习案例中这样用是可以的。而且我看了原子老师的相关回答也是这样的。应该叫外部引用 ...

12楼已经解释的很好了

自己多打打基础吧
学无止境
回复

使用道具 举报

16

主题

197

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
457
金钱
457
注册时间
2012-4-20
在线时间
91 小时
 楼主| 发表于 2016-10-27 17:32:26 | 显示全部楼层
本帖最后由 ba5rw 于 2016-10-27 17:34 编辑
jermy_z 发表于 2016-10-27 17:26
12楼已经解释的很好了

自己多打打基础吧

晕,不能这么武断啊,请您把最佳答案去掉,问题还没解决啊。我下午查了不少资料,原则是可以这么写的,肯定还有隐藏的问题,只是还没找出来,谢谢了!您也可以搜搜原子老师的相关回答。
而且我在main里

调用a();函数是通过的,说明不是文件添加的问题。
回复

使用道具 举报

15

主题

184

帖子

0

精华

高级会员

Rank: 4

积分
647
金钱
647
注册时间
2014-4-29
在线时间
299 小时
发表于 2016-10-27 17:33:27 | 显示全部楼层
ba5rw 发表于 2016-10-27 17:23
奇怪的是我在另一个学习案例中这样用是可以的。而且我看了原子老师的相关回答也是这样的。应该叫外部引用 ...

如果你另一个案例中也是这么用的,结果还好使,那你那个案例肯定还有别的问题,不是语法上的。
这个你多查查资料吧。c程序里面不同模块之间的参数传递确实是个很难的东西。
回复

使用道具 举报

16

主题

197

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
457
金钱
457
注册时间
2012-4-20
在线时间
91 小时
 楼主| 发表于 2016-10-27 17:38:05 | 显示全部楼层
xianshasaman 发表于 2016-10-27 17:33
如果你另一个案例中也是这么用的,结果还好使,那你那个案例肯定还有别的问题,不是语法上的。
这个你多 ...

是的,不过另一个案例是在Mdk3中完成学习的,所以非常困惑。
回复

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13102
金钱
13102
注册时间
2012-11-26
在线时间
3811 小时
发表于 2016-10-27 18:24:25 | 显示全部楼层
ba5rw 发表于 2016-10-27 17:38
是的,不过另一个案例是在Mdk3中完成学习的,所以非常困惑。

你的问题已经解决了

自己知识面不够,就回去好好打基础,而不是瞎扯淡
学无止境
回复

使用道具 举报

5

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
144
金钱
144
注册时间
2014-2-12
在线时间
22 小时
发表于 2016-10-27 18:32:41 | 显示全部楼层
11111111111111.png
试试把 u8 abc =88;放到a函数外面。
回复

使用道具 举报

16

主题

197

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
457
金钱
457
注册时间
2012-4-20
在线时间
91 小时
 楼主| 发表于 2016-10-28 08:51:13 | 显示全部楼层
本帖最后由 ba5rw 于 2016-10-28 08:57 编辑
jermy_z 发表于 2016-10-27 18:24
你的问题已经解决了

自己知识面不够,就回去好好打基础,而不是瞎扯淡

如果我的知识面够了还需要到论坛求助?您是版主吧?您这样的态度对初学者真的是一种无情的打击?
你咋知道我的问题解决了?您能否建立一个工程试试?我是在学习extern的用法,也请您了解一下新的环境新的问题好不好?

另外说明下,您自以为是的把别人还没解决的某个答复设为最佳答案只能说明您自己的无知,无知不是罪,否则也就不会有悬赏求助贴,但是用权限坚持自己的无知并打压别人就不是很明智了!
而且您要求我上工程,我也上了,即使是我因为无知犯错,作为施助者也应该用自己的说法帮助提问者理解,怎么张口就训斥提问者?还说我胡扯什么的?您要是认为我胡扯可以不回复我,我又不是来灌水无聊顶贴什么的?!真不知道您是怎么想的?
回复

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13102
金钱
13102
注册时间
2012-11-26
在线时间
3811 小时
发表于 2016-10-28 08:54:34 | 显示全部楼层
ba5rw 发表于 2016-10-28 08:51
如果我的知识面够了还需要到论坛求助?您是版主吧?您这样的态度对初学者真的是一种无情的打击?
你咋知 ...

自己知识不够,人家已经给你正确的解决办法了,而你却认为没有解决

你这样的态度,还是不要学习了
学无止境
回复

使用道具 举报

16

主题

197

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
457
金钱
457
注册时间
2012-4-20
在线时间
91 小时
 楼主| 发表于 2016-10-28 09:01:39 | 显示全部楼层
本帖最后由 ba5rw 于 2016-10-28 09:04 编辑
jermy_z 发表于 2016-10-28 08:54
自己知识不够,人家已经给你正确的解决办法了,而你却认为没有解决

你这样的态度,还是不要学习了

我已经解释了,extern abc是手误,我用的是extern u8 abc,已经解释过了,你还是坚持你的最佳答案!而且事实上我这两种都试过,没有区别!
有的文献已经说明了:用extern对外部变量进行声明时可以省略变量类型
回复

使用道具 举报

26

主题

280

帖子

1

精华

高级会员

Rank: 4

积分
908
金钱
908
注册时间
2013-8-2
在线时间
279 小时
发表于 2016-10-28 09:05:06 | 显示全部楼层
给你举个例子吧。
《STM32之串口》:http://blog.csdn.net/feilusia/article/details/52819571

重点就几个:
1、全局变量要放在函数体外。
2、定义要放在.c中,可赋值也可不赋值。如“U8 gua = 0;”或“U8 gua ;”
3、声明要放在.h中,不能赋值。如“extern U8 gua;”
博客:http://blog.csdn.net/feilusia
CC2541群(127442605);CC2640群(557278427);
Android群(541462902);STM8/STM32群(164311667);
Linux群(512598061);职场交流群(450154342);
回复

使用道具 举报

6

主题

94

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1581
金钱
1581
注册时间
2016-7-2
在线时间
277 小时
发表于 2016-10-28 09:08:58 | 显示全部楼层
ba5rw 发表于 2016-10-28 09:01
我已经解释了,extern abc是手误,我用的是extern u8 abc,已经解释过了,你还是坚持你的最佳答案!而且 ...

平复一下心情~来论坛是解决问题的
回复

使用道具 举报

6

主题

94

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1581
金钱
1581
注册时间
2016-7-2
在线时间
277 小时
发表于 2016-10-28 09:12:36 | 显示全部楼层
有的文献说的可以省略可能是编译器不同,加上一定不会报错
回复

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13102
金钱
13102
注册时间
2012-11-26
在线时间
3811 小时
发表于 2016-10-28 09:14:16 | 显示全部楼层
ba5rw 发表于 2016-10-28 09:01
我已经解释了,extern abc是手误,我用的是extern u8 abc,已经解释过了,你还是坚持你的最佳答案!而且 ...

QQ截图20161028091249.jpg



那请问你 有没有看12楼的回复???!!!!


不再跟你争论了,只能跟你说,如果你还是这样的学习态度,只能说你走不远

学无止境
回复

使用道具 举报

16

主题

197

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
457
金钱
457
注册时间
2012-4-20
在线时间
91 小时
 楼主| 发表于 2016-10-28 09:28:52 | 显示全部楼层
本帖最后由 ba5rw 于 2016-10-28 09:29 编辑
jermy_z 发表于 2016-10-28 09:14
那请问你 有没有看12楼的回复???!!!!

我当然看过12楼的答复,首先感谢12楼的朋友,但是我的问题是extern的用法,所以12楼的应该没能解决偶的问题,23楼理解我的问题核心,问题就在于我基本上按照23楼的步骤去做,始终未能解决,也不跟您争,先感谢您的回复和指教,只是希望以后对待我们这些初学者能多一点耐心和尊重,没其他意思了,拜托了,谢谢!
回复

使用道具 举报

16

主题

197

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
457
金钱
457
注册时间
2012-4-20
在线时间
91 小时
 楼主| 发表于 2016-10-28 09:33:17 | 显示全部楼层
迪拜大呲花 发表于 2016-10-28 09:08
平复一下心情~来论坛是解决问题的

是的,谢谢!调整心态不难,我只是希望这个版主要真正了解提问者的所需再做决断,虽然论坛的规则已经说明了版主有权随时选择最佳答案,我帮别人回复的也有好几个被选为最佳答案的。但是我希望最佳答案要尊重提问者,这样后来者才明白是怎么解决问题的。
回复

使用道具 举报

26

主题

280

帖子

1

精华

高级会员

Rank: 4

积分
908
金钱
908
注册时间
2013-8-2
在线时间
279 小时
发表于 2016-10-28 09:45:54 | 显示全部楼层
ba5rw 发表于 2016-10-28 09:28
我当然看过12楼的答复,首先感谢12楼的朋友,但是我的问题是extern的用法,所以12楼的应该没能解决偶的问 ...

a.c文件:
void a(void)
{
   u8 abc=88;
}

你这个是把abc放在局部变量,这怎么能叫按照23楼的步骤去做?
博客:http://blog.csdn.net/feilusia
CC2541群(127442605);CC2640群(557278427);
Android群(541462902);STM8/STM32群(164311667);
Linux群(512598061);职场交流群(450154342);
回复

使用道具 举报

10

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2014-10-14
在线时间
23 小时
发表于 2016-10-28 09:58:40 | 显示全部楼层
你的问题不是extern的用法,是变量定义的问题,请看12楼及29楼!
回复

使用道具 举报

5

主题

266

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1526
金钱
1526
注册时间
2016-7-20
在线时间
155 小时
发表于 2016-10-28 10:09:35 | 显示全部楼层
本帖最后由 super910906 于 2016-10-28 10:28 编辑

a.h文件:

#ifndef __A_H
#define __A_H                           
#include "stm32f10x.h"

extern u8 abc;

void a (void);

#endif

a.c文件:

#include "a.h"
u8 abc;
void a(void)
{
   abc=88;
}

main.c文件

#include "stm32f10x.h"
#include "delay.h"
#include "sys.h"
#include "a.h"

u8 n;
int main()
{
   n=abc;
}



我是可以什么都不说 ,但不可以什么都不做。
回复

使用道具 举报

16

主题

197

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
457
金钱
457
注册时间
2012-4-20
在线时间
91 小时
 楼主| 发表于 2016-10-28 10:36:32 | 显示全部楼层
feilusia 发表于 2016-10-28 09:45
a.c文件:
void a(void)
{

我已经试了,您的办法。
u8 abc;
void a()
{
abc=88;
}
由于疏忽,h文件里头屏蔽了extern,所以出错。现在按照您的提示已经编译通过,并且测试了在main里头定义abc 在a点c里头使用extern abc也是可以的,谢谢了!
回复

使用道具 举报

16

主题

197

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
457
金钱
457
注册时间
2012-4-20
在线时间
91 小时
 楼主| 发表于 2016-10-28 10:38:18 | 显示全部楼层
super910906 发表于 2016-10-28 10:09
a.h文件:

#ifndef __A_H

基本上是可以了,但是n好像不需要在main外部定义的。我的测试是不需要的。

通过本次求助我深刻理解了extern的用法,谢谢各位,包括性子有点急的版主,哈哈!
回复

使用道具 举报

50

主题

193

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2016-4-11
在线时间
141 小时
发表于 2016-10-28 10:40:39 | 显示全部楼层
我在这个论坛也发过很多求助帖,很多大神帮忙解决,也有一些大神不屑。你应该这样想,帮你是情谊,不帮也不亏欠。在论坛发了求助,不一定就能解决。还要自己努力,继续搜集资料!共勉
回复

使用道具 举报

16

主题

197

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
457
金钱
457
注册时间
2012-4-20
在线时间
91 小时
 楼主| 发表于 2016-10-28 10:53:06 | 显示全部楼层
滴丶滴 发表于 2016-10-28 10:40
我在这个论坛也发过很多求助帖,很多大神帮忙解决,也有一些大神不屑。你应该这样想,帮你是情谊,不帮也不 ...

其实我上面有点急的原因是版主没有了解我的需求,擅自就设了最佳答案,如果我屈服,后面就没有人教我了,大家以为问题解决了。12楼的答复现在回过头看是正确的,但是对于几乎没有C语言基础的我来说,并不能马上理解。实际上extren和全局变量的使用是有所区别的,12楼用的都是全局和局部变量的概念,可是我们是面向解决问题的学习,是遇到问题再去探究,我感觉这种学习方法比事先去死记硬背的要实际的多,这个论坛好就好在这里。有时候我也会看到有的朋友问了很低级的问题,是我能理解的我也会去热心回答人家,绝不会叫人家躲到马桶上学完C基础再来提问什么的……哈哈!共勉!
回复

使用道具 举报

5

主题

266

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1526
金钱
1526
注册时间
2016-7-20
在线时间
155 小时
发表于 2016-10-28 11:20:25 | 显示全部楼层
ba5rw 发表于 2016-10-28 10:38
基本上是可以了,但是n好像不需要在main外部定义的。我的测试是不需要的。

通过本次求助我深刻理解了e ...

我把n定义在主函数外面,是我自己的编程习惯。
我是可以什么都不说 ,但不可以什么都不做。
回复

使用道具 举报

79

主题

397

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1814
金钱
1814
注册时间
2015-9-21
在线时间
558 小时
发表于 2016-10-28 12:23:21 | 显示全部楼层
我也就呵呵了,给我一个帮助你的理由。
回复

使用道具 举报

16

主题

197

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
457
金钱
457
注册时间
2012-4-20
在线时间
91 小时
 楼主| 发表于 2016-10-28 12:33:08 | 显示全部楼层
硕果累累 发表于 2016-10-28 12:23
我也就呵呵了,给我一个帮助你的理由。

不帮助别人可以默默路过,总不能拦住别人说他神经病,他弱智,别理他吧?!哈哈……
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2016-10-28 12:39:50 | 显示全部楼层
ba5rw 发表于 2016-10-28 10:53
其实我上面有点急的原因是版主没有了解我的需求,擅自就设了最佳答案,如果我屈服,后面就没有人教我了, ...

借此地说说个人的看法和最近感受,可能有些主观
1.设置最佳答案是看你的问题简单明显,回复直击问题,后来回复是手误,但最佳答案更改权限一般坛友都没有,包括jermy_z大神
2.基础还是要打的,有问题再去探究,有可能会事倍功半,走太多弯路
3.你热心回答坛友,做法是好的,这在初期很正常,坚持一年半载,等你回复多了,如果你还能如此热心,那我服你,各种伸手、问题描述不清、基础严重不足、资料不搜索直接问等等都会看到
4.问题发错被置为已解决,再次发帖就行了,没什么纠结的
5.jermy_z是坛友,不是论坛工作人员,没有利益关系,自己的帖子只要有人回复/参与,除了彻底的扯淡,都是对自己的帮助
6.楼主半年或几个月后回看本帖可能会有新认识
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

26

主题

280

帖子

1

精华

高级会员

Rank: 4

积分
908
金钱
908
注册时间
2013-8-2
在线时间
279 小时
发表于 2016-10-28 12:41:24 | 显示全部楼层
ba5rw 发表于 2016-10-28 10:53
其实我上面有点急的原因是版主没有了解我的需求,擅自就设了最佳答案,如果我屈服,后面就没有人教我了, ...

代码问题是小,习惯问题是大。
告诉LZ你存在的问题:
1、12楼已经告诉你答案了,当初为何不实际测试一下?
2、任何给你回帖的人,哪怕是说你的不好,都能增加你帖子的热度,对你有帮助,不能只看到别人的不好。
3、系统学习是主,问问题是辅,学习如果主辅颠倒,会举步维艰。

博客:http://blog.csdn.net/feilusia
CC2541群(127442605);CC2640群(557278427);
Android群(541462902);STM8/STM32群(164311667);
Linux群(512598061);职场交流群(450154342);
回复

使用道具 举报

7

主题

247

帖子

0

精华

高级会员

Rank: 4

积分
745
金钱
745
注册时间
2016-1-20
在线时间
78 小时
发表于 2016-10-28 12:44:21 | 显示全部楼层
这个局部变量和全局变量可分清楚了!
回复

使用道具 举报

24

主题

695

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1666
金钱
1666
注册时间
2016-4-29
在线时间
266 小时
发表于 2016-10-28 13:00:54 | 显示全部楼层
extern ,是声明这个变量是个外部文件变量,我一般是在使用变量的文件中声明,而不是在.h里,以上类子来说,我会这么用:

a.c中:

u8 abc;

static void a(void);//只能本a.c使用

void a(void)
{

}

void b(void)
{

}

a.h中:
void b(void);//可供外部文件使用,但要包含本.h


Main.c中:

extern u8 abc;//声明此变量为外部文件变量,

main()
{
abc =1;

}
回复

使用道具 举报

24

主题

695

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1666
金钱
1666
注册时间
2016-4-29
在线时间
266 小时
发表于 2016-10-28 13:05:39 | 显示全部楼层
另外,如果还有一个b.c文件
b.c中:
static u8 abc;

static void a(void);//只能本b.c使用,虽然a.c中也有一个a(),但是不干涉

void a(void)
{

}


以上文件在同一个工程内,以上纯手打,可能 有误,包含语句就不写了

回复

使用道具 举报

24

主题

695

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1666
金钱
1666
注册时间
2016-4-29
在线时间
266 小时
发表于 2016-10-28 13:09:42 | 显示全部楼层
变量与函数尽量内敛,不供外部文件使用的全部控制在本文件内,不同文件有同名函数与变量也没关系,因为对于外部文件来说,它是不可见的,
回复

使用道具 举报

26

主题

280

帖子

1

精华

高级会员

Rank: 4

积分
908
金钱
908
注册时间
2013-8-2
在线时间
279 小时
发表于 2016-10-28 13:14:35 | 显示全部楼层
d1z1y2 发表于 2016-10-28 13:05
另外,如果还有一个b.c文件
b.c中:
static u8 abc;

1、函数体前也需要static
2、不建议在.c中使用extern,不便于快速移植、不便于阅读代码、不便于修改代码。
你这么胡乱地在各个.c中使用,一旦变量需要改动,每个.c都需要改动,牵一发而动全身。别人看你代码也很头疼。

博客:http://blog.csdn.net/feilusia
CC2541群(127442605);CC2640群(557278427);
Android群(541462902);STM8/STM32群(164311667);
Linux群(512598061);职场交流群(450154342);
回复

使用道具 举报

16

主题

197

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
457
金钱
457
注册时间
2012-4-20
在线时间
91 小时
 楼主| 发表于 2016-10-28 13:35:33 | 显示全部楼层
feilusia 发表于 2016-10-28 12:41
代码问题是小,习惯问题是大。
告诉LZ你存在的问题:
1、12楼已经告诉你答案了,当初为何不实际测试一 ...

1、我要知道12楼在说什么还会发生后面的事情吗?
2、有一个人在问题没有解决之前就设了最佳答案,然后我要服服帖帖的表示感谢同意,由此导致后面想帮的人路过没有帮,您认为都能增加我的帖子热度?
3、系统学习当然是好,但是系统学习的外衣下害人也是事实。多少系统学习科班出身的不如初中文化的单片机高手,不如他们对社会的贡献也是有目共睹的!
回复

使用道具 举报

16

主题

197

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
457
金钱
457
注册时间
2012-4-20
在线时间
91 小时
 楼主| 发表于 2016-10-28 13:37:37 | 显示全部楼层
footprint 发表于 2016-10-28 12:44
这个局部变量和全局变量可分清楚了!

熟知不等于真知……呵呵!
回复

使用道具 举报

16

主题

197

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
457
金钱
457
注册时间
2012-4-20
在线时间
91 小时
 楼主| 发表于 2016-10-28 13:40:36 | 显示全部楼层
龙之谷 发表于 2016-10-28 12:39
借此地说说个人的看法和最近感受,可能有些主观
1.设置最佳答案是看你的问题简单明显,回复直击问题,后 ...

谢谢龙之谷大神!

我是比较不服的是他既然错设了,可以不道歉,可以路过……但不可以继续掩盖错误!……不说了。
回复

使用道具 举报

26

主题

280

帖子

1

精华

高级会员

Rank: 4

积分
908
金钱
908
注册时间
2013-8-2
在线时间
279 小时
发表于 2016-10-28 13:45:20 | 显示全部楼层
ba5rw 发表于 2016-10-28 13:35
1、我要知道12楼在说什么还会发生后面的事情吗?
2、有一个人在问题没有解决之前就设了最佳答案,然后我 ...

1、看不懂可以追问,更何况你在13楼里明显是看懂的,反问了一句也没有去测试12楼所说的。
2、问题有没有解决大家看回帖内容,不是看有没有满意答案被选中。你看看实际效果增加热度了没有?
3、系统学习是让你好好把知识点从基础看到高级,不是让你去学校读书。
博客:http://blog.csdn.net/feilusia
CC2541群(127442605);CC2640群(557278427);
Android群(541462902);STM8/STM32群(164311667);
Linux群(512598061);职场交流群(450154342);
回复

使用道具 举报

15

主题

184

帖子

0

精华

高级会员

Rank: 4

积分
647
金钱
647
注册时间
2014-4-29
在线时间
299 小时
发表于 2016-10-28 13:58:29 | 显示全部楼层
42楼还给出了对全局变量的一种很古典的使用方法,这个方法甚至不用在main.c里面 加上 #include “a.c”。
这个方法在某些场合效率很高,而且肯定是能用的,你可以自己测试一下。
你遇到的问题想要彻底搞明白就至少要涉及3个方面:变量的作用域和存储空间;c语言预编译处理过程;c程序不同模块间数据的传递。
你确实应该先看看相关的资料,虽然不至于能写一本书,但是也不是一个帖子能说明白的。

另外楼主你要明白大家都是来论坛交流的,不是来辩论的,有帮助就听,没帮助就算了,而且我也没发现哪一楼的回答有误导你的现象。我以前新手的时候在各种论坛去问问题总会收到一大堆误导性的答案,有的时候明显就是错的,有的时候确实真假难辨,有的时候也不能说是错的,但也绝对不是对的,一反驳还被嘲讽,有时候封号都封的莫名其妙。相比之下,这里的素质还不错的。给你结个帖真没什么,再问就好了。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-24 21:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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