OpenEdv-开源电子网

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

请教关于如何理解该全局变量定义及使用方法

[复制链接]

4

主题

98

帖子

0

精华

高级会员

Rank: 4

积分
755
金钱
755
注册时间
2015-9-16
在线时间
94 小时
发表于 2016-3-28 23:27:01 | 显示全部楼层 |阅读模式
5金钱
该方法的描述如下:
众所周知,全局变量应该是得到内存分配且可以被其他模块通过C 语言中extern 关键字调用的变量。因此,必须在 .C 和 .H
文件中定义。这种重复的定义很容易导致错误。以下讨论的方法只需用在头文件中定义一次。虽然有点不易懂,但用户一旦掌握,使用起来却很灵活。
定义全局宏。
    #ifdef xxx_GLOBALS
    #define xxx_EXT
    #else
    #define xxx_EXT extern
    #endif
当编译器处理.C文件时,它强制xxx_EXT(在相应.H文件中可以找到)为空,(因为xxx_GLOBALS已经定义)。所以编译器给每个全局变量分配内存空间,而当
编译器处理其他.C 文件时,xxx_GLOBAL 没有定义,xxx_EXT
被定义为extern,这样用户就可以调用外部全局变量。

这是在uc/os-ii学习中看到的,个人没有理解到的地方在后半段“在其他.c文件中会被定义为extern,这样用户就可以调用外部全局变量“。此时是在哪个文件中,调用哪里的变量呢?能提及使用这种方法的例子更佳。
自己也是想了很多次,但限于资质愚笨,一直想融会贯通这种方法而不得。

希望各位能不吝赐教,在此感谢。
外链参考(http://www.itdadao.com/2016/01/07/154753/

最佳答案

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

现在有3个源文件文件1.c,2.c,3.c和一个定义全局变量的头文件global.h。 在global.h中有如下定义, #ifdef xxx_GLOBALS #define xxx_EXT #else #define xxx_EXT extern #endif 在1.c中有如下定义, #define xxx_GLOBALS #include "global.h" xxx_EXT int xxx; ......省略 在2.c和3.c中有如下定义, #include "global.h" xxx_EXT int xxx; ......省略 这样,虽 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

16

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
214
金钱
214
注册时间
2015-12-21
在线时间
18 小时
发表于 2016-3-28 23:27:02 | 显示全部楼层
现在有3个源文件文件1.c,2.c,3.c和一个定义全局变量的头文件global.h。
在global.h中有如下定义,
    #ifdef xxx_GLOBALS
    #define xxx_EXT
    #else
    #define xxx_EXT extern
    #endif
在1.c中有如下定义,
    #define xxx_GLOBALS
    #include "global.h"
    xxx_EXT int  xxx;
    ......省略
在2.c和3.c中有如下定义,
    #include "global.h"
    xxx_EXT int xxx;
    ......省略
这样,虽然在所有c文件中都有xxx_EXT int xxx语句,但是因为1.c中有定义#define xxx_GLOBALS,就变成了定义变量 int xxx;
在2.c和3.c中由于没有定义#define xxx_GLOBALS,就变成了声明外部变量extern int xxx;,正是在1.c中定义的xxx,没有重复定义。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 12:43

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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