在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
芯片精品文章合集(500篇!)    创芯人才网--重磅上线啦!
查看: 1935|回复: 0

[资料] 宏定义伪指令

[复制链接]
发表于 2016-2-24 16:59:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x

宏定义伪指令分为:简单宏、参数宏、条件宏、预定义宏及宏释放。

1)
简单宏

格式

#define宏标识符宏体

其中:

宏体是由单词序列组成。宏体超长时,允许使用续行符“\”进行续行,续行符和其后的换行符\n都不会进入宏体中。

在定义宏时,应尽量避免使用C语言的关键词和预处理器的预定义宏,以免引起灾难性的后果。

在源文件中吗,用预处理器伪指令定义过宏标识符之后,就可用宏标识符编写程序。当源文件被预处理器处理时,每遇到该宏标识符,预处理器便在宏的所在处将宏展为宏体。

示例:8段数码管简单宏定义

/定义8段数码管控制寄存器地址/

#define           LED8ADDR                 (。(volatile unsigned char。 )0x2140000)

Void Digit_Led_Symbol(int value)

{

If((value >=0)&&(value<16))                    /。符号显示。/

              IED8ADDR=~Symbol[value]       /。预处理器将IED8ADDR 替换为地址。/

                                                               /。0x2140000的内存单元。/

}

2)
参数宏

格式

#define宏标识符(形式参数表)宏体

其中:

形式参数表由单词序列组成。有些单词包含参数表的形式参数。宏体超长时,允许使用续行符“\”进行续行,续行符和其后的换行符\n都不会进入宏体中。

使用参数宏时,形式参数表应换为同样个数的实参数表,这一点类似于函数的调用。事实上,许多库函数是用参数宏编写的。参数宏和函数的区别:一是形式参数表中没有类型说明符;二是参数宏在时空的开销上比函数都要小。

.预处理器在处理参数宏时使用2遍宏展开。第1遍展开宏体,第2遍对展开后的宏体用实参数替换形式参数。

示例
用参数宏进行数学运算及比较大小。

# define   SQR(x,y)sqrt(x)。(x)+(y)。(y))

源文件中有:

Z=SQR(a+b,a-b);          /。替换为sqrt((a+b)。(a-b)+(a-b)。(a-b));。/

#define min(x1,x2)        ((x1<x2)?x1:x2)

#define max(x1,x2)              ((x1>x2)?x1:x2)

1)
条件宏定义

先测试是否定义过某宏标识符,然后决定如何处理。

格式

#ifdef             宏标识符

       #undef    宏标识符

       #define    宏标识符
宏体

#else

       #define    宏标识符
宏体

#endif

其中:


左边格式是测试存在,右边是测试不存在。


左边格式和右边格式的else部分可以没有,有与没有意义不同。

示例
用条件宏实现大小端模式的选择。

#ifdef_BIG_ENDIAN

#define    rUTXH0         (。(volatile unsigned char 。 )0x1D00023)

#define    rUTXH1        (。(volatile unsigned char 。)0x1D04023)

……

#define    UTXH0         (0x1D00024+3)

#define    UTXH1         (0x1D00024+3)


#else                            //LittleEndian

#define    rUTXH0         (。(volatile unsigned char 。 )0x1D00020)

#define    rUTXH1         (。(volatile unsigned char 。 )0x1D00020)

……

#define    UTXH0          (0x1D00024)

#define    UTXH1          (0x1D00024)

#endif

示例
用条件宏实现块大小的定义

#ifndef BLOCK-SIZE

              #defineBLOCK-SIZE 128

#else

              #undefBLOCK-SIZE

              #defineBLOCK-SIZE 128

#endif

4)宏释放

用于释放原先定义的宏标识符。经释放后的宏标识符可再次用于定义其他宏体。

格式

#undef    宏标识符

示例
用宏释放实现块大小定义

#ifndef BLOCK-SIZE    512

buf= BLOCK-SIZE。blks;/。宏扩展为buf=512。blks。/

#undef BLOCK-SIZE

#define BLOCK-SIZE        128

buf= BLOCK-SIZE。blks;/。宏扩展为buf=128。blks。/

“。”代表星号

凌阳教育,专注嵌入式人才培养多年,完善的培养方案,强大的师资,合理的课程安排,成功从小白蜕变为嵌入式工程师。想了解凌阳教育,或者获得更多嵌入式学习资料的免费下载,请点击www.sunplusedu.com访问凌阳教育官网

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

本版积分规则

关闭

站长推荐 上一条 /2 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-5-5 06:41 , Processed in 0.035686 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表