我是靠谱客的博主 美好月亮,最近开发中收集的这篇文章主要介绍宏定义#define括号使用的深入认识,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

宏定义:注意x,y值都有一个括号,和特定的符号时 需要加上括号!
// SWAP(x, y)               交换x,y的值  
#define SWAP(x, y)  
    (y) = (x) + (y);  
    (x) = (y) - (x);  
    (y) = (y) - (x);  

求最大值和最小值
   #define  MAX( x, y ) ( ((x) > (y)) ? (x) : (y) )
   #define  MIN( x, y ) ( ((x) < (y)) ? (x) : (y) )

写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。另外,当你写下面的代码时会发生什么事?
least = MIN(*p++, b);
  解答:
#define MIN(A,B)   ((A) <= (B) ? (A) : (B))  注意外面还有一层括号!!
  MIN(*p++, b)会产生宏的副作用
  剖析:
  这个面试题主要考查面试者对宏定义的使用,宏定义可以实现类似于函数的功能,但是它终归不是函数,而宏定义中括弧中的“参数”也不是真的参数,在宏展开的时候对“参数”进行的是

一对一的替换。
  程序员对宏定义的使用要非常小心,特别要注意两个问题:
  (1)谨慎地将宏定义中的“参数”和整个宏用用括弧括起来。所以,严格地讲,下述解答:
#define MIN(A,B) (A) <= (B) ? (A) : (B)
#define MIN(A,B) (A <= B ? A : B )
  都应判0分;
  (2)防止宏的副作用。

宏定义#define MIN(A,B) ((A) <= (B) ? (A) : (B))对MIN(*p++, b)的作用结果是:

((*p++) <= (b) ? (*p++) : (b)) 

这个表达式会产生副作用,指针p会作两次++自增操作。

除此之外,另一个应该判0分的解答是:

#define MIN(A,B) ((A) <= (B) ? (A) : (B));
这个解答在宏定义的后面加“;”,显示编写者对宏的概念模糊不清。

将一个字母转换为大写
#define  UPCASE( c ) ( ((c) >= 'a' && (c) <= 'z') ? ((c) - 0x20) : (c) )

返回数组元素的个数 

#define   ARR_SIZE( a )   ( sizeof( (a) ) / sizeof( (a[0]) ) )

对于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)))

得到一个字的高位和低位字节
#define  WORD_LO(xxx)  ((byte) ((word)(xxx) & 255))
#define  WORD_HI(xxx)  ((byte) ((word)(xxx) >> 8))

在宏之中用do{}while(0)语句包含多语句防止错误。

宏中"#"和"##"的用法 我们使用#把宏参数变为一个字符串,用##把两个宏参数贴合在一起.

最后

以上就是美好月亮为你收集整理的宏定义#define括号使用的深入认识的全部内容,希望文章能够帮你解决宏定义#define括号使用的深入认识所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部