C语言——宏定义

C语言——宏定义


宗旨:技术的学习是有限的,分享的精神是无限的。


注意:宏定义不是函数!!
一般用来简化操作的,但又能避免函数调用那样需要进行切换环境,花费时间。例如:
#define max (a,b) (a>b?a:b)
#define MALLOC(n, type)   ((type *)  malloc( (n) * sizeof(type) ))
使用时,我只需:
a=max (a,b);                //而不是a=(a>b?a:b);
int *p=MALLOC(10,int);  //而不是int *p= ((int *)  malloc((10) * sizeof (int) ))

1、防止一个头文件被重复包含 
#ifndef _COMDEF_H_ 
#define _COMDEF_H_  //头文件内容
#endif  /* _COMDEF_H_ */

2、重命名一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植。 
typedef  unsigned char       boolean;    /* Boolean value type. */   
typedef  unsigned long int  uint32_t;     /* Unsigned 32 bit value */ 
typedef  unsigned short      uint16_t;     /* Unsigned 16 bit value */ 
typedef  unsigned char       uint8_t;      /* Unsigned 8  bit value */   
typedef  signed long int      int32_t;      /* Signed 32 bit value */ 
typedef  signed short          int16_t      /* Signed 16 bit value */ 
typedef  signed char           int8_t;        /* Signed8  bit value */ 

3、得到指定地址上的一个字节或字 
#define  MEM_B( x )  ( *( (byte *) (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 )   ( (dword) &(( type *) 0)-> field) 

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); \ 
  (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)) 

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) >= '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、返回一个无符号数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))) 
  #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)(val))) 

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 _宏指令含有形式为月/日/年的串,表示源文件被翻译到代码时的日期。 
  源代码翻译到目标代码的时间作为串包含在_ 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 DEBUGMSG(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;\ 
                  a++;}while(0)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/467065.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一个深入学习Linux/C/C++的原创技术号

今天给大家推荐一个Linux/C/C领域的公众号&#xff0c;大家都知道这个领域的号不多&#xff0c;而【编程珠玑】就是这样一个专注该领域的原创类公众号&#xff0c;原创占比95%以上&#xff0c;目前已有原创文章200多篇&#xff0c;而且原创间环环相扣&#xff0c;皆有关联。公众…

Redis Java调用

Redis Java调用 package com.stono.redis;import redis.clients.jedis.Jedis;public class RedisJava {public static void main(String[] args) {Jedis jedis new Jedis("localhost");System.out.println("ok");System.out.println("ping "jed…

Linux 资料大全

Hello all&#xff0c;给大家分享一些 Linux 学习资料&#xff0c;包含&#xff1a;社区网站、在线教程、命令大全、在线模拟器、经典书籍、镜像站点等 ...从入门到进阶&#xff0c;应有尽有。无论你是小白&#xff0c;还是 Linux 高手&#xff0c;都不容错过&#xff0c;100% …

C语言——字符串函数

C语言——字符串函数 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 常用字符串操作函数的实现&#xff1a;注释部分你们注意一下&#xff0c;我没加/&#xff0c;加了/就看不到注释了。 ************************************************* *功能:实…

创业思考点滴

创业的理由应该是为了做更有意义的事&#xff0c;而不是赚更多钱&#xff0c;是为了更大程度地实现自身价值&#xff0c;而不是得到更多财富。 创业对个人是很大的挑战&#xff0c;这种挑战会让人成长得更快。 在创业过程中&#xff0c;自省很重要&#xff0c;很多时候问题与困…

各种排序方法的比较

简单排序包括直接插入排序、冒泡排序、和简单选择排序。 排序方法的稳定性&#xff1a;假设KiKj&#xff08;1<i<n,1<j<n,i!j&#xff09;&#xff0c;若在排序前的序列中Ri领先于Rj&#xff08;即i<j&#xff09;&#xff0c;经过排序后得到的序列中Ri领先于Rj…

生命很短,我用tldr

我们平时使用命令的时候&#xff0c;如果忘记的或者不知道这个命令如何使用&#xff0c;然后你就会去百度&#xff0c;也会去使用man 或者 -- help 查看&#xff0c;但是看到的一般都是长篇大论。如果你看了这篇文章&#xff0c;就会知道tldr是怎么样的存在。tldr 的含义TL;DR …

Linux安装vsftpd

卸载vsftpd sudo yum remove vsftpd 安装vsftpd sudo yum -y install vsftpd 创建一个文件夹用来当作ftp得仓库 cd / sudo mkdir ftpfile 创建一个用户,仅对文件夹有上传权限,又没有登陆权限 sudo useradd ftpuser -d /ftpfile/ -s /sbin/nologin//赋值权限sudo chown -R ftpus…

EJB 学习笔记

1、ejb 基础知识&#xff08;1&#xff09; 无状态会话bean不保存客户机的会话状态优点&#xff1a;使用小量的实例即可满足大量的客户。每个实例都没有标识&#xff0c;相互之间是等价的。等?的无状态会话bean&#xff1a; 多次和一次调用的结果和效应相同。在集群中可以…

C语言——项目规范

C语言——项目规范 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 //基本原则 1、尽量少使用全局变量&#xff0c;或者说禁止使用全局变量&#xff1b; 2、实在要在其他文件使用本文件中的变量&#xff0c;以函数接口返回其值&#xff0c;在其他文件…

折半查找判定树及平均查找长度

折半查找判定树及平均查找长度 从折半查找的过程看&#xff0c;以有序表的中间记录作为比较对象&#xff0c;并以中间记录将表分割为两个子表&#xff0c;对子表继续上述操作。所以&#xff0c;对表中每个记录的查找过程&#xff0c;可用二叉树来描述&#xff0c;二叉树中的每个…

华为开始对嵌入式开发者下手了!

5G时代到来&#xff0c;物联网技术的应用也离我们越来越近。智慧交通、智能家庭、智慧园区&#xff0c;越来越多的融入到我们的生活当中。作为物联网重要技术组成的嵌入式系统&#xff0c;嵌入式系统视角有助于深刻地、全面地理解物联网的本质。而物联网是通用计算机的互联网与…

慎用Hyper-Threading Technology

今天&#xff0c;一个同事遇到了一个非常奇怪的问题&#xff0c;他的程序&#xff08;C#&#xff09;运用了Hyper-Threading技术&#xff0c;系统用的是Windows 2000 SP4&#xff0c;当程序运行时会随机的抛出一个异常&#xff0c;而且这个bug很不容易reproduce&#xff0c;最后…

BZOJ1876 [SDOI2009]SuperGCD 【高精 + GCD优化】

题目 Sheng bill有着惊人的心算能力&#xff0c;甚至能用大脑计算出两个巨大的数的GCD&#xff08;最大公约 数&#xff09;&#xff01;因此他经常和别人比 赛计算GCD。有一天Sheng bill很嚣张地找到了你&#xff0c;并要求和你比 赛&#xff0c;但是输给Sheng bill岂不是很丢…

二叉排序树和平衡二叉排序树

二叉排序树又称为二叉查找树&#xff0c;它是一颗特殊的二叉树。&#xff08;空树&#xff09; 性质&#xff1a;1、若它的左子树非空&#xff0c;则左子树上的所有结点的值均小于根结点的值。 2、若它的右子树非空&#xff0c;则右子树上的所有结点的值均大于根结点的值。 3、…

C语言九阳神功

C语言笔记(九阳神功) 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 1.static的作用&#xff1a; &#xff08;1&#xff09;在函数体内&#xff0c;一个被声明为静态的变量在这一函数被调用过程中维持其值不变&#xff08;该变量存放在静态变量区&…

FUSE文件系统

Fuse(filesystem in userspace),是一个用户空间的文件系统。通过fuse内核模块的支持&#xff0c;开发者只需要根据fuse提供的接口实现具体的文件操作就可以实现一个文件系统。由于其主要实现代码位于用户空间中&#xff0c;而不需要重新编译内核&#xff0c;这给开发者带来了众…

myeclipse试用小记----Hibernate多对一双向关联(2)

myeclipse试用小记----Hibernate多对一双向关联&#xff08;2&#xff09;在上篇文章“myeclipse试用小记----Hibernate多对一单向关联&#xff08;1&#xff09;”中&#xff0c;讲到了“Hibernate多对一单向关联”&#xff0c;现在我打算把这个做成双向的&#xff0c;也就是多…

Python的程序结构[4] - 函数/Function[2] - 匿名函数

匿名函数 / Anonymous Function 匿名函数是一种不需要绑定函数名的函数 (i.e. functions that are not bound to a name)。匿名函数通过 lambda 表达式进行构建。常用于快速建立起一个(一次性的)函数。 Note: lambda 是 Python 的一个表达式/关键字&#xff0c;类似 return&…

数组 的地址计算

数组是一个特殊的数据结构&#xff0c;数组的基本操作不涉及数组结构的变化&#xff0c;因此对于数组而言&#xff0c;采用顺序存储表示比较合适。数组的顺序存储结构有两种&#xff1a;一、以行序存储&#xff0c;如高级语言BASIC、COBOL、Pascal、c语言。二、以列序存储&…