关于全局变量的定义

这篇具有很好参考价值的文章主要介绍了关于全局变量的定义。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  • 全局变量,在A.c文件中定义的变量,在A.h中用extern声明一下即为全局变量,B.c文件想要调用的话只需要,包含A.h即可使用
  • 如果不想让其他.c文件引用本文件中的变量,加上static即可。
  • static关键字的作用:
    1、在函数体修饰变量时,一个被声明为的static静态变量在这一函数被调用过程中维持其值不变。在下一次调用时,这个值还是维持上次调用结束时的值。
    2、在模块内(但在函数体外)修饰变量时,一个被声明为的static静态变量可以被模块内所用函数访问,但不能被模块外其它函数访问。准确地说static关键字在模块内的作用域是从定义之处开始,到文件结尾处结束。它是一个本地的全局变量,当然在函数调用过程中这个变量的值也会维持不变。
    3、在模块内修饰函数时,一个被声明为静态的函数只可被这一模块内的其它函数调用。 那就是 ,这个函数被限制在声明它的模块的本地范围内使用。这样做的好处一是能避免不同模块之间函数重名时发生冲突;另外static关键字也告诉了编程人员这个函数只能在本模块里面使用,不能被外部模块调用,避免了代码维护时意外调用。
  • include相当于把include .h文件直接带入到本源文件里,比如在b.c文件里include “A.h”,就相当于把A.h文件里所有定义的变量和函数全部拷贝了一份放入了B.c里,一个项目里,一个.h文件可能会被多个.c源文件包含,这样编译的时候就会报重复定义的错误。而且尽量不要在.h里定义变量
  • 如何在头文件里定义全局变量:
    众所周知,全局变量应该是得到内存分配且可以被其他模块通过C 语言中extern 关键字调用的变量。因此,必须在 .C 和 .H 文件中定义。这种重复的定义很容易导致错误。以下讨论的方法只需用在头文件中定义一次。虽然有点不易懂,但用户一旦掌握,使用起来却很灵活。
    定义全局宏。
#ifdef xxx_GLOBALS
#define xxx_EXT
#else
#define xxx_EXT extern
#endif

.H 文件中每个全局变量都加上了xxx_EXT 的前缀。xxx 代表模块的名字。该模块的.C 文件中有以下定义:

    #define xxx_GLOBALS
    #include "includes.h"

当 编译器处理.C 文件时,它强制xxx_EXT(在相应.H文件中可以找到)为空,(因为xxx_GLOBALS已经定义)。所以编译器给每个全局变量分配内存空间,而当 编译器处理其他.C 文件时,xxx_GLOBAL 没有定义,xxx_EXT 被定义为extern,这样用户就可以调用外部全局变量。为了说明这个概念,可以参见uC/OS_II.H,其中包括以下定义:

    #ifdef OS_GLOBALS
    #define OS_EXT
    #else
    #define OS_EXT extern
    #endif
    OS_EXT INT32U OSIdleCtr;
    OS_EXT INT32U OSIdleCtrRun;
    OS_EXT INT32U OSIdleCtrMax;

同时,uCOS_II.H 有中以下定义:

    #define OS_GLOBALS
    #include “includes.h”

当编译器处理uCOS_II.C 时,它使得头文件变成如下所示,因为OS_EXT 被设置为空。

INT32U OSIdleCtr;
INT32U OSIdleCtrRun;
INT32U OSIdleCtrMax;

这样编译器就会将这些全局变量分配在内存中。当编译器处理其他.C 文件时,头文件变成了如下的样子,因为OS_GLOBAL 没有定义,所以OS_EXT 被定义为extern。

extern INT32U OSIdleCtr;
extern INT32U OSIdleCtrRun;
extern INT32U OSIdleCtrMax;

在这种情况下,不产生内存分配,而任何 .C 文件都可以使用这些变量。这样的就只需在 .H文件中定义一次就可以了。

**

关于函数的调用

**
1、通常做法–在A.c中定义,在A.h中extern出来,那么其他编译单元include这个A.h文件就可以使用这个变量。

2、函数如果定义在A.c文件中,或者定义在A.h文件中并且A.c文件#include了这个A.h就不用加extern,因为这两种情况下A.c文件都可以直接找到

一旦有一个函数定义在另一个B.c文件中,而你要想在A.c文件中使用的时候就必须用extern关健字声明一下,否则链接会出错。

3、此外,函数申明默认就是extern的,所以函数声明前的extern可以省略不加。钩子函数文章来源地址https://www.toymoban.com/news/detail-444582.html

到了这里,关于关于全局变量的定义的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity 全局变量的定义和修改

    2024年02月02日
    浏览(65)
  • 汇编调用C语言定义的全局变量

    在threadx移植中,系统的systick通过了宏定义的方式定义,很难对接库函数的时钟频率,不太利于进行维护 所以在C文件中自己定义了一个systick_Div的变量,通过宏定义方式设定systick的时钟频率 在汇编下要加载这个systick分频系数 方法: 总结:对汇编指令需要进一步熟悉。

    2024年02月15日
    浏览(46)
  • vue3 ts 定义全局变量

    在 Vue3 中使用 TypeScript 定义全局变量可以这样做: 创建一个文件,如 global.d.ts ,并在其中声明全局变量。 在 main.ts 或其他入口文件中引入该文件。 在需要使用全局变量的地方直接使用即可。 注意,这种方式只能用于定义全局变量,不能用于定义全局函数或类。

    2024年02月17日
    浏览(49)
  • FPGA设计Verilog基础之Verilog全局变量和局部变量定义

    注意:后续技术分享,第一时间更新,以及更多更及时的技术资讯和学习技术资料 ,将在公众号 CTO Plus 发布,请关注公众号: CTO Plus   在Verilog中,变量可以分为全局变量和局部变量两种类型。全局变量在整个模块中都可以使用,而局部变量只能在某个特定的代码块中使用。

    2024年02月15日
    浏览(39)
  • 关于css中设置变量用于全局Css或者Js中使用

    一、配置变量css文件 src/styles/variables.scss 二、在组件中使用变量

    2024年02月07日
    浏览(41)
  • 【C/C++】C/C++ 如何定义全局变量

    在 C++ 中,可以在函数外部定义全局变量。全局变量是指在程序的任何地方都可以访问的变量,它的作用域是整个程序。 定义全局变量的语法格式如下: 其中,extern 用于声明全局变量,告诉编译器该变量是在其他源文件中定义的。在头文件中定义全局变量时,需要使

    2024年02月15日
    浏览(39)
  • Vue3之app.config.globalProperties(定义全局变量)

    注意:如果全局属性与组件自己的属性冲突,组件自己的属性将具有更高的优先级。 1、创建一个文件(通过useGlobelProperties获取全局属性) 2、在main.ts中(配置全局属性) 3、任意组件中的使用 打印所得:   可以看到我们上面定义的name可以拿到,后续想要什么全局配置,可

    2024年02月15日
    浏览(39)
  • JavaScript保留字和预定义的全局变量及函数汇总

    保留字也称,每种语言中都有该语言本身规定的一些,这些都是该语言的语法实现基础,JavaScript中规定了一些标识符作为现行版本的或者将来版本中可能会用到的,所以当我们定义标识符时就不能使用这些了,下面介绍下JavaScript保留

    2024年01月16日
    浏览(61)
  • 欧姆龙SysmacStudio 关于模块化编程的使用技巧---全局变量和数据类型

    在平常使用欧姆龙SysmacStudio 编程时,有新建大量的结构体和全局变量,若不分类进行模块化,会造成查找不方便,下面分享的就是对全局变量和数据类型进行模块分类,方便查找,提高编程效率。 下图中是新建的一个系统周期时钟频率的FB块 为了方便在程序中使用,将FB的输

    2024年02月06日
    浏览(68)
  • 关于uniapp全局挂载变量/方法的问题,没遇到过点进来吧,记录一下我踩过的坑。

    事情是这样的,我在用uniapp做一个微信小程序,遇到了个问题,是在封装uni.request()到全局方法的时候,其实就很简单的,是关于 this的指向问题 (若想了解此问题的话,点这里去看大佬的文章!!!) ,找几个小时的博客都未能解决。 建uniapp项目时用了vue3,那么就要遵

    2024年02月16日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包