全局变量宏定义(精)_第1页
全局变量宏定义(精)_第2页
免费预览已结束,剩余2页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

2、OBALS#defi ne xxx_EXT#else#defi ne xxx_EXT exter n#en dif H 文件中每个全局变量都加上了 xxx_EXT 的前缀。xxx 代表模块的名字。该模 块的.C 文件中有以下定义:#defi ne xxx_GLOBALS#include includes.h当编译器处理.C 文件时,它强制 xxx_EXT(在相应.H 文件中可以找到)为空,(因为 xxx_GLOBAL 已经定义)。所以编译器给每个全局变量分配内存空间,而 当编译器处理其他.C 文件时,xxx_GLOBA 没有定义,xxx_EXT 被定义为 extern , 这样用户就可以调用外

3、部全局变量。为了说明这个概念,可以参见 uC/OS_II.H,其中包括以下定义:#ifdef OS_GLOBALS #defi ne OS_EXT #else#define OS_EXT extern #en difOS_EXT INT32UOSIdleCtr;OS_EXT INT32UOSIdleCtrR un;OS_EXT INT32UOSIdleCtrMax;同时,uCOS_II.H 有中以下定义:#defi ne OS_GLOBALS#inelude“ includes.h ”当编译器处理 uCOS_II.C 时,它使得头文件变成如下所示,因为OS_EXT 被设置为空。INT32UOS

4、IdleCtr;INT32UOSIdleCtrR un;INT32UOSIdleCtrMax;这样编译器就会将这些全局变量分配在内存中。当编译器处理其他 .C 文件时, 头文件变成了如下的样子,因为 OS_GLOBA 没有定义,所以 OS_EX 被定义为 extern。extern INT32UOSIdleCtr;extern INT32UOSIdleCtrR un;extern INT32UOSIdleCtrMax;在这种情况下,不产生内存分配,而任何 .C 文件都可以使用这些变量。这样的 就只需在.H 文件中定义一次就可以了。【网友经验(来自 CSDN】:尽管一个全局变量或函数可以(在多个

5、编译单元中)有多处“声明”,但是“定义” 却只能允许出现一次。定义是分配空间并赋初 值(如果有)的声明。最好的安排是在某个相关的.c 文件中定义,然后在头文件 (h)中进行外部声明,在需要使用的时候,只要包含对应的头文件即可。 定义 变量的.c 文件也应该包含该头文件,以便编译器检查定义和声明的一致性。这条规则提供了高度的可移植性:它和 ANSI C 标准一致,同时也兼容大多 数ANSI 前的编译器和连接器。Unix 编译器和连接器通常使用“通用模式”允 许多重定义,只要保证最多对一处进行初始化就可以了;ANSI C 标准称这种行 为为“公共扩展”,没有语带双关的意思。如果希望让编译器检查声明

6、的一致性,一定要把全局声明放到头文件中。特 别是,永远不要把外部函数的原型放到.c 文件中:通常它与定义的一致性不能 得到检查,而矛盾的原型比不用还糟糕。如何定义宏、取消宏/定义宏#defi ne/取消宏#undef MacroName普通宏#define PI (3.1415926)带参数的宏#define max(a,b) (a) (b)? (a),(b)MacroNameMacroValue关键是十分容易产生错误, 包括机器和人理解上的差异等等。 所以如果用的话,建议所有的 层次都要加括号。条件编译#ifdef XXX(#else)#endif例如#ifdef DV22_AUX_INPU

7、T#defineAUX_MODE3#else#defineAUY_MODE3endif#ifndefXXX(#else)#endif头文件(.h)可以被头文件或C文件包含;重复包含(重复定义) 由于头文件包含可以嵌套,那么C文件就有可能包含多次同一个头文件,就可能出现重复 定义的问题的。通过条件编译开关来避免重复包含(重复定义)例如#ifndef_headerfileXXX_define_headerfileXXX_文件内容#endif#define的一些用法karla发表于2005-3-2816:36:001.简单的define定义#define MAX 1000一个简单的max就定义好了,

8、它代表1000,如果在程序里面写for(i=0;i编译器在处理这个代码之前会对MAX进行处理替换为1000。2.define的“函数定义”define可以像函数那样接受一些参数,如下#define max(x,y) (x) (y)?(x):(y);这个定义就将返回两个数中较大的那个, 看到了吗?因为这个 “函数”没有类型检查,就好像 一个函数模板似的,当然,它绝对没有模板那么安全就是了。 可以作为一个简单的模板来使 用而已。但是这样做的话存在隐患,例子如下:#define Add(a,b)a+b;在一般使用的时候是没有问题的,但是如果遇到如:c * Add(a,b)* d的时候就会出 现问题,

9、代数式的本意是a+b然后去和c,d相乘,但是因为使用了define(它只是一个简单的替换),所以式子实际上变成了c*a + b*d另外举一个例子:#define pin (int*); pin a,b;本意是a和b都是int型指针,但是实际上变成int* a,b;a是int型指针,而b是int型变量。这是应该使用typedef来代替define,这样a和b就都是int型指针了。3.宏的单行定义#define#defineA(x)B(x)T_#x#x#defineC(x)#x我们假设:x=1,则有:A(1)-T_1B(1)-1 C(1)-1 这里参考了hustli的文章)3.define的多行定义define可以替代多

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论