宏的使用 extern
声明全局变量使用的技术。
有些时候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文件中定义一次就可以了。
宏的使用 extern的更多相关文章
- 理解宏的使用 extern
		如何定义一个全局变量在一个文件中,然后在其它文件中调用就行,而不需要多次extern外部声明. 由于之前的公司的程序中全局的变量使用得很多,在多个.C文件中会调用,不这样处理做的话就会多处进行exte ... 
- VC分发包版本问题
		来源:http://www.cnblogs.com/mixiyou/archive/2010/02/09/1663620.html 之前曾经写过一篇个人经历,是关于VC2005分发包版本不一致而引起应 ... 
- 使用DLL进行不同语言之间的调用(转)
		源:使用DLL进行不同语言之间的调用 __declspec(dllexport) 是告诉编译器用来导出函数的,在代码中不另作说明了. extern "C" 的意思就是用C的方式来导 ... 
- 如何使用 VS生成动态库?
		如何使用 VS生成动态库? //.cpp 文件默认定义了 __cplusplus 宏 #ifdef __cplusplus extern "C"{ #endif xxx #ifde ... 
- #if defined(__cplusplus)
		由于C++编译器需要支持函数的重载,会改变函数的名称,因此dll的导出函数通常是标准C定义的.这就使得C和C++的互相调用变得很常见.但是有时可能又会直接用C来调用,不想重新写代码,让标准C编写的dl ... 
- C与C++混编
		了解一下C与C++如何合作,gcc和g++编译出来的东西有什么区别. 工具使用 objdump是个好工具,可以用于查看.o文件的内容,也可以查看可执行文件的内容. 查看符号表 objdump -t f ... 
- C 标准库 - <errno.h>
		C 标准库 - <errno.h> 简介 C 标准库的 errno.h 头文件定义了整数变量 errno,它是通过系统调用设置的,在错误事件中的某些库函数表明了什么发生了错误.该宏扩展为类 ... 
- 【VS开发】MFC中调用C函数模块的解决方案
		[VS开发]MFC中调用C函数模块的解决方案 标签(空格分隔): [VS开发] 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 说明:最近调试基于MFC的程序 ... 
- C++关键字总结【新手必学】
		const 关键字——常量const 与definedefine是预编译器的编译指令,它从C语言兼容下来,工作方式与文本编辑器中的全局搜索和替换相似.define定义的常量的意义在它开始的地方持续到文 ... 
随机推荐
- Eclipse+PyDev解决中文输入和注释问题
			Eclipse的设置 window->preferences->general->editors->text editors->spelling->encoding ... 
- Lua刚開始学习的人(一)--Lua 简单教学
			近期因为工作原因.临时木有<Oracle起步学习>续集.领导知道学习下Lua脚本语言.看了一周了.趁热打铁,留下点实用的东西吧. 本系列会主要针对宿主语言为 Delphi,原理都是一样的, ... 
- 深度学习2015年文章整理(CVPR2015)
			国内外从事计算机视觉和图像处理相关领域的著名学者都以在三大顶级会议(ICCV.CVPR和ECCV)上发表论文为荣,其影响力远胜于一般SCI期刊论文.这三大顶级学术会议论文也引领着未来的研究趋势.CVP ... 
- [转]C语言预处理命令详解
			转载:https://www.cnblogs.com/clover-toeic/p/3851102.html 一 前言 预处理(或称预编译)是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的 ... 
- 《从0到1》读书笔记第2章"像1999 年那样狂欢"第1记:小结及词汇解析
			小结 本章的目的应该是通过90年代末的互联网泡沫的背景,成因.影响,以及教训来教诫人们,在全部人都疯狂的抛身于洪流热潮之中时,我们要冷静的思考辨识出那些不切实际的大众观点,找到隐藏在这些观点后面的反主 ... 
- vim 基础学习之插入模式
			插入模式1.字符编码,插入特殊字符 <C-v>{3位} 如,你想输入A,你可以在输入模式下<C-v>065(必须是3位) <C-v>u{4位} 如,你想输入¿,你可 ... 
- 湖南省第八届大学生计算机程序设计竞赛(A,B,C,E,F,I,J)
			A 三家人 Description 有三户人家共拥有一座花园,每户人家的太太均需帮忙整理花园.A 太太工作了5 天,B 太太则工作了4 天,才将花园整理完毕.C 太太因为正身怀六甲无法加入她们的行列, ... 
- 深入了解"网上邻居"原理
			说到“网上邻居”,相信很多人都很熟悉.但是说起“网上邻居”的工作机制,可能大家就不太清楚了. 要说“网上邻居”的工作机制,不妨联系一下生活中的例子:比如我(A),要拜访一个远方的朋友(B),我要去他的 ... 
- 【hihocoder 1122】二分图二•二分图最大匹配之匈牙利算法
			[Link]:https://hihocoder.com/problemset/problem/1122 [Description] [Solution] 二分图匹配,匈牙利算法模板题; 这里我先把染 ... 
- ThinkPad E431 获取无限网络的驱动
			sudo apt-get install linux-headers-generic build-essential dkms sudo apt-get install linux-source ... 
