宏定义

作者: 枫叶1234 | 来源:发表于2017-11-30 09:22 被阅读15次

    宏定义:注意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++) : (*p++))

    这个表达式会产生副作用,指针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)语句包含多语句防止错误。

    相关文章

      网友评论

          本文标题:宏定义

          本文链接:https://www.haomeiwen.com/subject/newmbxtx.html