OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
12
返回列表 发新帖
楼主: ba5rw

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

[复制链接]

16

主题

197

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
457
金钱
457
注册时间
2012-4-20
在线时间
91 小时
 楼主| 发表于 2016-10-28 14:33:14 | 显示全部楼层
xianshasaman 发表于 2016-10-28 13:58
42楼还给出了对全局变量的一种很古典的使用方法,这个方法甚至不用在main.c里面 加上 #include “a.c”。
...

嗯,感谢42楼的朋友,这样的学习环境比啃书好多了……

我以前玩过51单片机,那时候也是自己糊弄的玩,全局变量只要在函数前定义就可以了,也没有使用独立的模块,也就是所有的函数都在一个文件模块里完成,编译一次性通过。现在玩stm32,才感觉必须模块分类,于是就导致有些不同模块中年函数内的参数需要传递和共用,所以就暴露了技能知识的缺陷,我也不怕人家见笑。最近的确在恶补预编译处理的知识所以都是自己写头文件什么的,变量的作用域和存储空间理论上当然学过,但是到用的时候忘得差不多了,几乎所有学过C语言的,如果后来没有使用,我相信都会忘得差不多的。如果再去翻书估计得有不少折腾,你看上论坛这不是一下就解决了?哈哈,也谢谢您的指教!

至于那位版主我也不会揪住不放,我知道他其实也是一种热心,否则可以不理我走开就是了,所以在此也一并道歉,希望他大度大量一点……
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

26

主题

280

帖子

1

精华

高级会员

Rank: 4

积分
908
金钱
908
注册时间
2013-8-2
在线时间
279 小时
发表于 2016-10-28 14:54:04 | 显示全部楼层
“如果再去翻书估计得有不少折腾,你看上论坛这不是一下就解决了”,LZ如果有这种思想,会误入“伸手党”之列。
坐地上放个碗来钱也快,何苦要辛苦工作。你说是么?
没什么恶意,建议LZ好好思考解决问题的方法。
博客:http://blog.csdn.net/feilusia
CC2541群(127442605);CC2640群(557278427);
Android群(541462902);STM8/STM32群(164311667);
Linux群(512598061);职场交流群(450154342);
回复

使用道具 举报

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2775
金钱
2775
注册时间
2015-6-1
在线时间
394 小时
发表于 2016-10-28 15:03:56 | 显示全部楼层
feilusia 发表于 2016-10-28 13:14
1、函数体前也需要static
2、不建议在.c中使用extern,不便于快速移植、不便于阅读代码、不便于修改代码 ...

大神,借帖子一层楼,有事请教。PS:虽然看完了楼主的问题,但是我的问题不针对楼主。
关于static的使用,它只在一个.c中可以用,我经常在代码中看到定义了一个结构体,然后在某个.c里static了一个结构全的对象。比如下面的这样
struct rt_semaphore
{
……
};
static struct rt_semaphore mod_sem;
在本.c文件中可以正常使用,但是如果我在其它.c中也想使用mod_sem怎么办呢?
是在其它.c中也写一句static struct rt_semaphore mod_sem;吗?两个c文件定义两次没问题 吗?

我现在的解决方法是根本不定义成static,但是我使用的框架中很多地方都定义着static,我又感觉最好不要改框架怕别人看不懂。
自在随心
回复

使用道具 举报

33

主题

984

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8017
金钱
8017
注册时间
2014-8-13
在线时间
1594 小时
发表于 2016-10-28 15:13:34 | 显示全部楼层
super910906 发表于 2016-10-28 10:09
a.h文件:

#ifndef __A_H

这个是正解了。
回复

使用道具 举报

26

主题

280

帖子

1

精华

高级会员

Rank: 4

积分
908
金钱
908
注册时间
2013-8-2
在线时间
279 小时
发表于 2016-10-28 15:14:57 | 显示全部楼层
yuzeyuan1 发表于 2016-10-28 15:03
大神,借帖子一层楼,有事请教。PS:虽然看完了楼主的问题,但是我的问题不针对楼主。
关于static的使用 ...

我的电机控制结构体是这么用的:
1、.h:
typedef struct   
{  
  signed long           DirectionSteps;                                           //含方向的步数  
  unsigned short        PulsePerSecond;                                           //每秒给的脉冲数
  unsigned char         Size;                                                     //步长
  unsigned long         StepsCount;                                               //电机走过的步数  
  unsigned char         Status;                                                   //电机转动状态
  signed long           DirectionPosition;                                        //含方向的位置
  signed long           DirectionPositionMax;                                     //含方向的位置上限  
  signed long           DirectionPositionMin;                                     //含方向的位置下限  
}MOTOR_CONFIG_2;

extern MOTOR_CONFIG_2 stMotor_Config_2;

2、.c
MOTOR_CONFIG_2 stMotor_Config_2 = {……};

3、其他.c调用举例
stMotor_Config_2.Size = 0;
博客:http://blog.csdn.net/feilusia
CC2541群(127442605);CC2640群(557278427);
Android群(541462902);STM8/STM32群(164311667);
Linux群(512598061);职场交流群(450154342);
回复

使用道具 举报

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2775
金钱
2775
注册时间
2015-6-1
在线时间
394 小时
发表于 2016-10-28 17:12:38 | 显示全部楼层
feilusia 发表于 2016-10-28 15:14
我的电机控制结构体是这么用的:
1、.h:
typedef struct   

我也是这么用,但是我正在用的rt-thread框架中,比如读RTC时钟的程序,框架中就直接定世这样:
2、.c
static  MOTOR_CONFIG_2 stMotor_Config_2 = {……};
然后我就不会在其它.c中调用了,就算试着可以用,我也担心两个量会错乱,所以一直没敢用static.
自在随心
回复

使用道具 举报

15

主题

184

帖子

0

精华

高级会员

Rank: 4

积分
647
金钱
647
注册时间
2014-4-29
在线时间
299 小时
发表于 2016-10-28 17:31:21 | 显示全部楼层
yuzeyuan1 发表于 2016-10-28 17:12
我也是这么用,但是我正在用的rt-thread框架中,比如读RTC时钟的程序,框架中就直接定世这样:
2、.c
s ...

如果一个static型变量里有太多的成员需要在外部模块来读写,那他就不该定义成static型。
如果只有某个成员需要在外面多处被读写,那该成员就不适合放进那个结构体里面。
如果你觉得原来的结构挺好,而且需要增加有限的几种对结构体里面的某些成员的操作,可是试试添加一些函数来操作他们,并把这些函数作为接口提供给外部模块
回复

使用道具 举报

17

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1280
金钱
1280
注册时间
2013-12-14
在线时间
567 小时
发表于 2016-10-28 18:45:04 | 显示全部楼层
yuzeyuan1 发表于 2016-10-28 17:12
我也是这么用,但是我正在用的rt-thread框架中,比如读RTC时钟的程序,框架中就直接定世这样:
2、.c
s ...

楼主53楼说的情况其实是不存在的,2个文件中,static定义的变量,就算变量名相同,也是两个变量,不会出现干扰的问题。

我认为57楼是正解,而且是比较简单的方法,使用函数接口的方式来进行static的读写操作,我没有使用过RT-THREAD,不知道具体是什么情况。

大概举个例子。

static int global_var = 0 ;

void write_var( int parameter )
{
        global_var = parameter ;
}

int read_var( void )
{
        return global_var ;
}
半导体->模拟电路->数字电路->单片机->汇编->C->操作系统->java
回复

使用道具 举报

17

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1280
金钱
1280
注册时间
2013-12-14
在线时间
567 小时
发表于 2016-10-28 18:53:40 | 显示全部楼层
yuzeyuan1 发表于 2016-10-28 17:12
我也是这么用,但是我正在用的rt-thread框架中,比如读RTC时钟的程序,框架中就直接定世这样:
2、.c
s ...

如果需要修改的参数太多的话,可以参考stm32库的做法,将静态变量定义为结构体,然后还是自己定义接口函数,在外部用指针的方式就可以一次进行多个变量的修改,总之,核心就是接口函数了,好处多多。
半导体->模拟电路->数字电路->单片机->汇编->C->操作系统->java
回复

使用道具 举报

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2775
金钱
2775
注册时间
2015-6-1
在线时间
394 小时
发表于 2016-10-28 20:19:31 | 显示全部楼层
东北小辉辉 发表于 2016-10-28 18:45
楼主53楼说的情况其实是不存在的,2个文件中,static定义的变量,就算变量名相同,也是两个变量,不会出 ...

OK谢谢,请收下我的膝盖。PS,我不是楼主
自在随心
回复

使用道具 举报

24

主题

695

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1666
金钱
1666
注册时间
2016-4-29
在线时间
266 小时
发表于 2016-10-29 00:35:46 | 显示全部楼层
feilusia 发表于 2016-10-28 13:14
1、函数体前也需要static
2、不建议在.c中使用extern,不便于快速移植、不便于阅读代码、不便于修改代码 ...

我认为,工程内的全局变量是越少用越好,减少跨文件的变量赋值和引用,虽然用起来很爽,但是程序大了以后,会很麻烦,每个文件都有使用某个全局变量,想象一下是什么后果,严重起来代码会失控,也更不便于阅读,都不知道某个变量在哪个地方被改值了…………
所以,我说的做法是为了提高内敛性,降低关联性,当然一个工程,要通盘考虑,也不能一概而论,大程序就得控制得好,小程序无所谓
另外,各位所说的写接口函数,我觉得是不错的方法
个人意见,共勉
回复

使用道具 举报

16

主题

197

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
457
金钱
457
注册时间
2012-4-20
在线时间
91 小时
 楼主| 发表于 2016-10-29 07:52:38 | 显示全部楼层
在51单片机时代,更是被告诫慎用全局变量,占硬件资源。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

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

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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