ImageVerifierCode 换一换
格式:DOC , 页数:9 ,大小:32.50KB ,
资源ID:5973344      下载积分:10 金币
快捷注册下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/5973344.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请

   平台协调中心        【在线客服】        免费申请共赢上传

权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

注意事项

本文(C语言宏定义技巧.doc)为本站上传会员【xrp****65】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

C语言宏定义技巧.doc

1、C语言宏定义技巧(常用宏定义) [精华] C语言宏定义技巧(常用宏定义)    写好C语言,漂亮的宏定义很重要,使用宏定义可以防止出错,提高可移植性,可读性,方便性 等等。下面列举一些成熟软件中常用得宏定义。。。。。。   1,防止一个头文件被重复包含 #ifndef COMDEF_H #define COMDEF_H   //头文件内容 #endif 2,重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植。 typedef  unsigned char      boolean;    

2、 /* Boolean value type. */   typedef  unsigned long int  uint32;      /* Unsigned 32 bit value */ typedef  unsigned short     uint16;      /* Unsigned 16 bit value */ typedef  unsigned char      uint8;       /* Unsigned 8  bit value */   typedef  signed long int    int32;    

3、   /* Signed 32 bit value */ typedef  signed short       int16;       /* Signed 16 bit value */ typedef  signed char        int8;        /* Signed 8  bit value */     //下面的不建议使用 typedef  unsigned char     byte;         /* Unsigned 8  bit value type. */ typedef  unsigned s

4、hort    word;         /* Unsinged 16 bit value type. */ typedef  unsigned long     dword;        /* Unsigned 32 bit value type. */   typedef  unsigned char     uint1;        /* Unsigned 8  bit value type. */ typedef  unsigned short    uint2;        /* Unsigned 16 bit value type. */

5、 typedef  unsigned long     uint4;        /* Unsigned 32 bit value type. */   typedef  signed char       int1;         /* Signed 8  bit value type. */ typedef  signed short      int2;         /* Signed 16 bit value type. */ typedef  long int          int4;         /* Signed 32 bit 

6、value type. */   typedef  signed long       sint31;       /* Signed 32 bit value */ typedef  signed short      sint15;       /* Signed 16 bit value */ typedef  signed char       sint7;        /* Signed 8  bit value */   3,得到指定地址上的一个字节或字 #define  MEM_B( x )  ( *( (byte *) 

7、x) ) ) #define  MEM_W( x )  ( *( (word *) (x) ) ) 4,求最大值和最小值    #define  MAX( x, y ) ( ((x) > (y)) ? (x) : (y) )    #define  MIN( x, y ) ( ((x) < (y)) ? (x) : (y) ) 5,得到一个field在结构体(struct)中的偏移量 #define FPOS( type, field ) \ /*lint -e545 */ ( (dword) &(( type *) 0)-> fiel

8、d ) /*lint +e545 */ 6,得到一个结构体中field所占用的字节数 #define FSIZ( type, field ) sizeof( ((type *) 0)->field ) 7,按照LSB格式把两个字节转化为一个Word #define  FLIPW( ray ) ( (((word) (ray)[0]) * 256) + (ray)[1] ) 8,按照LSB格式把一个Word转化为两个字节 #define  FLOPW( ray, val ) \   (ray)[0] = ((val) / 256); \

9、   (ray)[1] = ((val) & 0xFF) 9,得到一个变量的地址(word宽度) #define  B_PTR( var )  ( (byte *) (void *) &(var) ) #define  W_PTR( var )  ( (word *) (void *) &(var) ) 10,得到一个字的高位和低位字节 #define  WORD_LO(xxx)  ((byte) ((word)(xxx) & 255)) #define  WORD_HI(xxx)  ((byte) ((word)(xxx) >> 8))

10、 11,返回一个比X大的最接近的8的倍数 #define RND8( x )       ((((x) + 7) / 8 ) * 8 ) 12,将一个字母转换为大写 #define  UPCASE( c ) ( ((c) >= 'a' && (c) <= 'z') ? ((c) - 0x20) : (c) ) 13,判断字符是不是10进值的数字 #define  DECCHK( c ) ((c) >= '0' && (c) <= '9') 14,判断字符是不是16进值的数字 #define  HEXCHK( c ) ( ((c) >=

11、 '0' && (c) <= '9') ||\                        ((c) >= 'A' && (c) <= 'F') ||\ ((c) >= 'a' && (c) <= 'f') ) 15,防止溢出的一个方法 #define  INC_SAT( val )  (val = ((val)+1 > (val)) ? (val)+1 : (val)) 16,返回数组元素的个数 #define  ARR_SIZE( a )  ( sizeof( (a) ) / sizeof( (a[0]) ) ) 17,返回一个无符

12、号数n尾的值MOD_BY_Power_OF_TWO(X,n)=X%(2^n) #define MOD_BY_POWER_OF_TWO( val, mod_by ) \            ( (dword)(val) & (dword)((mod_by)-1) ) 18,对于IO空间映射在存储空间的结构,输入输出处理   #define inp(port)         (*((volatile byte *) (port)))   #define inpw(port)        (*((volatile word *) (port)))

13、   #define inpdw(port)       (*((volatile dword *)(port)))      #define outp(port, val)   (*((volatile byte *) (port)) = ((byte) (val)))   #define outpw(port, val)  (*((volatile word *) (port)) = ((word) (val)))   #define outpdw(port, val) (*((volatile dword *) (port)) = ((dword) (va

14、l))) [2005-9-9添加]  19,使用一些宏跟踪调试 A N S I标准说明了五个预定义的宏名。它们是: _ L I N E _ _ F I L E _ _ D A T E _ _ T I M E _ _ S T D C _ 如果编译不是标准的,则可能仅支持以上宏名中的几个,或根本不支持。记住编译程序 也许还提供其它预定义的宏名。 _ L I N E _及_ F I L E _宏指令在有关# l i n e的部分中已讨论,这里讨论其余的宏名。 _ D AT E _宏指令含有形式为月/日/年

15、的串,表示源文件被翻译到代码时的日期。 源代码翻译到目标代码的时间作为串包含在_ T I M E _中。串形式为时:分:秒。 如果实现是标准的,则宏_ S T D C _含有十进制常量1。如果它含有任何其它数,则实现是 非标准的。 可以定义宏,例如: 当定义了_DEBUG,输出数据信息和所在文件所在行 #ifdef _DEBUG #define DEBUGMSG(msg,date) printf(msg);printf(“%d%d%d”,date,_LINE_,_FILE_) #else       #define DEB

16、UGMSG(msg,date)  #endif   20,宏定义防止使用是错误 用小括号包含。 例如:#define ADD(a,b) (a+b) 用do{}while(0)语句包含多语句防止错误 例如:#difne DO(a,b) a+b;\                    a++; 应用时:if(….)           DO(a,b); //产生错误         else          解决方法: #difne DO(a,b) do{a+b;\         

17、           a++;}while(0)  宏中"#"和"##"的用法 一、一般用法 我们使用#把宏参数变为一个字符串,用##把两个宏参数贴合在一起. 用法: #include #include using namespace std; #define STR(s)     #s #define CONS(a,b)  int(a##e##b) int main() {     printf(STR(vck));           // 输出字符串"vck"     printf("%d

18、", CONS(2,3));  // 2e3 输出:2000     return 0; } 二、当宏参数是另一个宏的时候 需要注意的是凡宏定义里有用'#'或'##'的地方宏参数是不会再展开. 1, 非'#'和'##'的情况 #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))); MUL里的参数TOW会被展

19、开为(2). 2, 当有'#'或'##'的时候 #define A          (2) #define STR(s)     #s #define CONS(a,b)  int(a##e##b) printf("int max: %s ",  STR(INT_MAX));    // INT_MAX #include 这行会被展开为: printf("int max: %s ", "INT_MAX"); printf("%s ", CONS(A, A));               // compile erro

20、r  这一行则是: printf("%s ", int(AeA)); INT_MAX和A都不会再被展开, 然而解决这个问题的方法很简单. 加多一层中间转换宏. 加这层宏的用意是把所有宏的参数在这层里全部展开, 那么在转换宏里的那一个宏(_STR)就能得到正确的宏参数. #define A           (2) #define _STR(s)     #s #define STR(s)      _STR(s)          // 转换宏 #define _CONS(a,b)  int(a##e##b) #define CONS(a,b)

21、   _CONS(a,b)       // 转换宏 printf("int max: %s ", STR(INT_MAX));          // INT_MAX,int型的最大值,为一个变量 #include 输出为: int max: 0x7fffffff STR(INT_MAX) -->  _STR(0x7fffffff) 然后再转换成字符串; printf("%d ", CONS(A, A)); 输出为:200 CONS(A, A)  -->  _CONS((2), (2))  --> int((2)e(2)) 三

22、'#'和'##'的一些应用特例 1、合并匿名变量名 #define  ___ANONYMOUS1(type, var, line)  type  var##line #define  __ANONYMOUS0(type, line)  ___ANONYMOUS1(type, _anonymous, line) #define  ANONYMOUS(type)  __ANONYMOUS0(type, __LINE__) 例:ANONYMOUS(static int);  即: static int _anonymous70;  70表示该行行号; 第一层:ANONYMO

23、US(static int);  -->  __ANONYMOUS0(static int, __LINE__); 第二层:                        -->  ___ANONYMOUS1(static int, _anonymous, 70); 第三层:                        -->  static int  _anonymous70; 即每次只能解开当前层的宏,所以__LINE__在第二层才能被解开; 2、填充结构 #define  FILL(a)   {a, #a} enum IDD{OPEN, CLOSE};

24、 typedef struct MSG{   IDD id;   const char * msg; }MSG; MSG _msg[] = {FILL(OPEN), FILL(CLOSE)}; 相当于: MSG _msg[] = {{OPEN, "OPEN"},               {CLOSE, "CLOSE"}}; 3、记录文件名 #define  _GET_FILE_NAME(f)   #f #define  GET_FILE_NAME(f)    _GET_FILE_NAME(f) static char  FILE_NAM

25、E[] = GET_FILE_NAME(__FILE__); 4、得到一个数值类型所对应的字符串缓冲大小 #define  _TYPE_BUF_SIZE(type)  sizeof #type #define  TYPE_BUF_SIZE(type)   _TYPE_BUF_SIZE(type) char  buf[TYPE_BUF_SIZE(INT_MAX)];      -->  char  buf[_TYPE_BUF_SIZE(0x7fffffff)];      -->  char  buf[sizeof "0x7fffffff"]; 这里相当于: char  buf[11];

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服