野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 7386|回复: 12

教大家一个如何在头文件中定义全局变量的方法

[复制链接]
发表于 2017-10-12 11:32:40 | 显示全部楼层 |阅读模式
通常情况下,都是在C文件中定义全局变量,在头文件中声明,但是,如果我们定义的全局变量需要被很多的C文件使用的话,那么将全局变量定义在头文件里面会方便很多,那到底是如何实现的?
os_var.c文件内容

#define   OS_GLOBALS
/*
* os.h中定义很多的全局变量,但是os.h又需要被很多的c文件调用,如果不特殊处理的话,会出现全局变量多次定义的错误,
* 为了实现在os.h中定义全局变量,在os.h的开头加入以下宏定义,且在全局变量前面都加上“OS_EXT”
* #ifdef     OS_GLOBALS
* #define    OS_EXT
* #else
* #define    OS_EXT  extern
* #endif
* 然后单独定义一个os_var.c文件,然后包含os.h,且只在这个文件里面定义宏“OS_GLOBALS”,在其他包含os.h的文件中
* 都不定义宏“OS_GLOBALS”,那么在编译的时候,只有os_var.c里面的os.h里面的全局变量前面的OS_EXT才展开为空,其他
* 文件中包含的os.h中的全局变量前面的OS_EXT就展开为extern,即声明,而不是定义,这样就实现了在os.h中定义全局变量。
*/

#include "os.h"



os.h是uC/OS-III的总的头文件,里面定义了很多的全局变量,而且这个头文件会被很多的C文件调用,为了防止重复定义全局变量的问题,故采取了上面的方法,即单独新建一个C文件os_var.c,然后在这个C文件里面定义OS_GLOBALS这个宏,然后再包含os.h这个头文件。那么只有在编译os_var.c的时候,os.h里面的全局变量才是定义,其它c文件里面的os.h的变量都是声明,因为其它C文件我们不会定义OS_GLOBALS这个宏。
回复

使用道具 举报

发表于 2017-10-12 11:36:26 | 显示全部楼层
其实就是加上extern的声明
回复 支持 反对

使用道具 举报

发表于 2017-10-12 11:37:21 | 显示全部楼层
此方法绝壁不错,赶紧抢个沙发先
回复 支持 反对

使用道具 举报

发表于 2017-10-12 11:42:26 | 显示全部楼层
这方法不错,省去了定义的步骤
回复 支持 反对

使用道具 举报

发表于 2017-10-12 13:23:42 | 显示全部楼层
但是如果在定义的时候需要定义初始值  是不是就不可以了?比如不可以写成定义 extern uint8  change_count=0吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-12 13:49:21 | 显示全部楼层
niqingqing 发表于 2017-10-12 13:23
但是如果在定义的时候需要定义初始值  是不是就不可以了?比如不可以写成定义 extern uint8  change_count= ...

可以           
回复 支持 反对

使用道具 举报

发表于 2017-10-12 14:40:44 | 显示全部楼层

火哥,extern uint8  change_count=0 应该是定义不是声明吧?这样不就重复定义了吗
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-12 15:02:51 | 显示全部楼层
烁哥 发表于 2017-10-12 14:40
火哥,extern uint8  change_count=0 应该是定义不是声明吧?这样不就重复定义了吗

是声明,把原来的定义重抄一遍在前面加上 extern 就是声明。
回复 支持 反对

使用道具 举报

发表于 2017-10-23 15:07:54 | 显示全部楼层
加个extern,还可以这么用,学习了
回复 支持 反对

使用道具 举报

发表于 2018-6-2 14:06:54 | 显示全部楼层
这个用法学习到了
回复 支持 反对

使用道具 举报

发表于 2018-6-4 21:00:18 | 显示全部楼层
所以看大神的写的UCOSIII源码,有不少东西可学
回复 支持 反对

使用道具 举报

发表于 2018-11-29 09:24:33 | 显示全部楼层
谢谢分享!!!
回复

使用道具 举报

发表于 2018-12-10 14:30:43 | 显示全部楼层
真实有效,终于找到一个方法解决啦,谢谢火哥
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-26 03:54 , Processed in 0.435909 second(s), 34 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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