声明全局变量使用的技术。

有些时候C语言的一些条条框框就像语法。学会C语言就是学会了语法。

但是语法怎样使用就又是另一回事了。

我希望自己能多学习一些技巧,而不是一些固定的C语言语法。

这篇文章真的很好:参考:http://blog.chinaunix.net/uid-2282111-id-2113225.html

是关于如何定义全局变量的。

之前在我没有看μC/OS的时候,写过时间片轮转的程序。

那个时候定义全局变量真的很痛苦,总是报错说某某文件已经定义了。

后来才知道,可以在oled.c里面定义一个变量cnt.

如果你想让主函数,或者其他的文件(如key.c)也用到这个cnt,

就需要在oled.h文件中加入extern int cnt

这样就可以在main.c或者key.c中定义#include"oled.h"   ,就可以在main.c或key.c中调用cnt变量了.

但是这里讲的是另一种方法:

以下是如何定义全局 变量。众所周知,全局变量应该是得到内存分配且可以被其他模块通过C 语言中extern 关键字调用的变量。因此,必须在 .C 和 .H 文件中定义。这种重复的定义很容易导致错误。以下讨论的方法只需用在头文件中定义一次。虽然有点不易懂,但用户一旦掌握,使用起来却很灵活。表1.2 中的定义出现在定义所有全局变量的.H 头文件中。

程序清单 L 1.2 定义全局宏。
    #ifdef xxx_GLOBALS
    #define xxx_EXT
    #else
    #define xxx_EXT extern
    #endif

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

#define xxx_GLOBALS
    #i nclude "includes.h"

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

#ifdef OS_GLOBALS
    #define OS_EXT                               //这句话可以理解为把 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
    #i nclude “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文件中定义一次就可以了。

转载于:https://www.cnblogs.com/chulin/p/9389254.html

宏的使用 extern相关推荐

  1. c++ 中extern C 及#ifdef __cplusplus的作用

    浅析extern "C"的作用 关于extern "C"的作用和意思,网上资料已经有很多了(我也参考了几篇),不过我还是觉得有必要自己总结一下,毕竟" ...

  2. C语言之extern关键字探究

    作用:extern关键字可以用来声明变量和函数作为外部变量或者函数供其它文件使用.     那么使用extern 关键字与直接引用头文件有何不同呢?首先,引用头文件是一种预处理,而 extern 关键 ...

  3. C语言应用笔记(六):C语言extern关键字及其使用

    C 语言中,修饰符 extern 用在变量或者函数的声明前面,用来标识变量或函数的定义在别的文件中,提示编译器遇到此变量或函数时,在其他文件中寻找其定义.下面对 extern 关键字的几种用法进行说明 ...

  4. C语言 extern

    1 基本含义 extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义. 2 extern修饰变量的声明 举例-> 如果文件l ...

  5. 8086汇编语言精华笔记总结~

    目录 第一章 汇编语言的基础知识 1.计算机系统概述 硬件(Handware) 软件(Software) 2.汇编语言介绍 3.数据表示 1. BCD码 2. ASCII码 3. 真值和机器数 4. ...

  6. android luajava,android嵌入lua

    java嵌入lua有多种方案可选择,比如纯java的luaj .纯C jni的 luajava还有个lua4j.在android中嵌入lua,我偏向使用luajava(当然面对除arm外的平台如x86 ...

  7. php endall(),从G_BEGIN_DECLS和 G_END_DECLS说起

    今天开始正式研究gedit的源码,第一次看c/c++的源码,有点吃力啊,坚持不懈,慢慢来. 在gedit.c文件中遇到了G_BEGIN_DECLS和G_END_DECLS,平常搞C语言的东西,我个人几 ...

  8. c 调用c语言写的dll文件路径,手把手教你用C/C++语言创建及调试动态库DLL程序

    引子 动态链接库DLL文件不仅可以实现代码.资源和数据的共享,同时也可以对源代码起保护作用,对于开发者来讲,DLL的生成及调试是程序员必须掌握的一种技术,下面通过一个具体的例子,演示使用C/C++语言 ...

  9. C++中的重难点看这一篇就够了

    sizeof()是一个运算符,不是一个函数 看程序效率的快慢,可以直接看其汇编语言程序的多少 扩展名: c语言:cc++:cpp Java:先有类,再有方法 c++完全兼容c语法 getchar()等 ...

最新文章

  1. HashSet中的add()方法( 三 )(详尽版)
  2. 什么是Python?主要运用哪些方面?
  3. 【全栈项目上线(vue+node+mongodb)】06.nodejs服务上线(生产环境前后分离的vue项目中怎么解决跨域问题)...
  4. Angular中数据循环ngFor、条件判断ngIf、ngSwitch、执行事件(click)、表单事件(keyup)、ngClass、ngStyle的使用
  5. osal_start_timerEx(Lock_TaskID,SBP_START_DEVICE_EVT,SBP_PERIODIC_EVT_PERIOD)的理解
  6. Widget开发中遇到的坑
  7. [Effective JavaScript 笔记]第27条:使用闭包而不是字符串来封装代码
  8. Exchange2010安装过程中先决条件报错得处理方法
  9. KernelShark Documentation
  10. 使软件可二次开发_九思软件:平台型OA系统为何要好于项目型OA系统?
  11. NYOJ -11--奇偶数分离
  12. poj 2309 BST 使用树状数组的lowbit
  13. tkinter打包为exe后找不到图片 tkinter_TclError:couldn‘t open “a.png“ no such file or directory
  14. 如何利用python制作一个小游戏
  15. 迅为STM32MP157开发板手册更新记录
  16. Win10自动修复无法开机【完美解决】
  17. java 二维卡尔曼滤波_卡尔曼滤波 – Kalman Filtering
  18. C语言 分数加减法(输出最简形式)
  19. 网络项目实施方案介绍
  20. 在vscode编辑器里使用leetcode插件刷题

热门文章

  1. 解决pip install keras报错问题
  2. 中科大计算机应用,中科大2012计算机应用专业考研初试考什么
  3. oracle取两个小时内的数据,【求解】一个时间条件,查两个不同时间段数据怎么查...
  4. mysql mydumper_mysql数据库备份之mydumper
  5. C语言windows编程编写窗口
  6. android利用反射调用截屏api,Android利用反射机制调用截屏方法和获取屏幕宽高的方法...
  7. 网络营销外包新策略——B站坚信求新求变才能得以“青春永驻”!
  8. 企业网络推广专员浅析如何通过企业网络推广的方式提升网站权重?
  9. 网站发布外链如何防止后期被删除?
  10. node.js安装模式 的区别_如何使用nodejs写一个接口