C语言常用宏定义技巧

上传人:hs****ma 文档编号:557571691 上传时间:2023-08-18 格式:DOC 页数:4 大小:20.50KB
返回 下载 相关 举报
C语言常用宏定义技巧_第1页
第1页 / 共4页
C语言常用宏定义技巧_第2页
第2页 / 共4页
C语言常用宏定义技巧_第3页
第3页 / 共4页
C语言常用宏定义技巧_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《C语言常用宏定义技巧》由会员分享,可在线阅读,更多相关《C语言常用宏定义技巧(4页珍藏版)》请在金锄头文库上搜索。

1、文档供参考,可复制、编制,期待您的好评与关注! C语言常用宏定义技巧! 初学者AVR系列单片机用C语言编程,宏定义是个很重要的编程技巧。用好了宏定义,它可以增强程序的可读性、可移植性、方便性、灵活性等等。1. 防止一个头文件被重复包含:#ifndef COMDEF_H#define COMDEF_H /头文件内容 endif 当你所建的工程有多个源文件组成时,很可能会在多个文件里头包含了同一个头文件,如果借用上面的宏定义就能够避免同一个头文件被重复包含时进行多次编译。因为当它编译第一个头文件时总是没有定义#define COMDEF_H,那么它将编译一遍头文件中所有的内容,包括定义#defin

2、e COMDEF_H。这样编译再往下进行时如果遇到同样要编译的头文件,那么由于语句#ifndef COMDEF_H的存在它将不再重复的编译这个头文件。2. 通过宏定义使得同一数据类型的字节数不因不同的平台或不同的编译器而改变:typedef unsigned char boolean; /* Boolean value type */typedef unsigned long int uint32; /* Unsigned 32bit value*/typedef unsigned short uint16; /* Unsigned 16bit value */typedef unsigned

3、 char uint8; /* Unsigned 8bit value */typedef signed long int int32; /* Signed 32bit value */typedef signed short int16; /* Signed 16bit value */typedef signed char int8; /* Signed 8bit value */3. 得到指定地址的一个字节或字:#define MEM_B(x) (*(uint8 *)(x)#define MEM_W(x) (*(uint16 *)(x)注:类似于这种有多个字符串组成的宏定义一定要注意加上

4、“()”,因为我们知道宏定义只是一种简单的字符替换功能。4. 求最大值和最小值:#define MAX(x,y) (x)(y)?(x):(y)#define MAX(x,y) (x)field)6. 按照LSB格式把两个字节转化为一个Word:1#define FLIPW(ray) (word)(ray)0)*256)+(ray)1)或可以是#define FLIPW(data1,data2)(word)(data1)*256)+(data2)7.按照LSB格式把一个Word转化为两个字节:#define FLOPW(ray,val) do (ray)0=(val)/256); (ray)1

5、=(val)&0xFF);while(0)或可以是#define FLOPW(data1,data2,val) do data1=(val)/256); data2 =(val)&0xFF);while(0)注:这里的dowhile(0)是为了防止多语句的宏定义在使用中出错。比如:if()FLOPW(ray,val) else上面的程序代码中要是宏定义FLOPW(ray,val)中没有dowhile(0),这时我们应该将语句改为:if()FLOPW(ray,val)else8.得到一个变量的地址:#define B_PTR(var) (byte *)(void *)&(var)#define

6、W_PTR(var) (word *)(void *)&(var)注:宏定义语句中void *申明了该地址可以是任何类型变量的地址,byte *申明为单字节变量的地址,word *申明为双字节变量的地址。9.得到一个高位和低位字节:#define WORD_LO(xxx) (byte)(word)(xxx)&0xFF)#define WORD_HI(xxx) (byte)(word)(xxx)8)10.返回一个比X大的最接近的8的倍数:#define RND8(x) (x)+7)/8)*8)11.将一个字母转换为大写:#define UPCASE(c) ( (c) = a & (c) = A

7、& (c) (val) ? (val)+1 : (val)还可以做成循环计数的(加入计数器val是个无符号整数):#define INC_SAT(val) (val = (val)+1 (val) ? (val)+1 : (0)13. 宏中“#”和“#”的用法:一般用法:使用“#”把宏参数变为一个字符串,用”#”把两个宏参数结合在一起例程:i nclude cstdio.hi nclude climits.h#define STR(s) #s2#define CONS(a,b) int(a#e#b)int main() printf(STR(vck); /输出字符串“vck” printf(“

8、%d”,CONS(2,3); /2e3输出:2000return 0;当宏参数是另一个宏的时候,注意宏定义里有用“#”或“#”的地方宏参数是不会再展开的:非“#”和“#”情况:例程: #define TOW (2)#define MUL(a,b) (a*b)printf(“%d*%d=%d”,TOW,TOW,MUL(TOW,TOW);/该行可展开为printf(“%d*%d=%d”,(2),(2),(2)*(2));有“#”或“#”情况:例程:#define A (2)#define STR(s) #s#define CONS(a,b) int(a#e#b)printf(“int max: %

9、s”,STR(INT_MAX); /INT_MAX 在include/该行展开为printf(“int max: %s”,”INT_MAX”);/即这里只是展开宏STR(s),而下一级宏INT_MAX没有被展开printf(“%s”,CONS(A,A);/这一行编译将会产生错误,因为它展开为printf(“%s”,int(AeA);为了解决其不能展开的问题,我们可以多加一层中间转换宏以实现所有宏的展开,如果你在编程时不确定你是否用到宏的嵌套问题,最好都加一级中间转换宏,以免产生错误。例程:#define A (2)#define _STR(s) #s#define STR(s) _STR(s)#define _CONS(a,b) int(a#e#b)#define CONS(a,b) _CONS(a,b)printf(“int max: %s”,STR(INT_MAX);/INT_MAX将被展开,它是int型的最大值,输出为:int max: 0x7fffffffprintf(“%d”,CONS(A,A);/两层宏都将能够展开,CONS(A,A) _CONS(2), (2)int(2)e(2),输出为:200顶一下 回首页 3 /

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 国内外标准规范

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号