Chinaunix首页 | 论坛 | 博客
  • 博客访问: 513729
  • 博文数量: 168
  • 博客积分: 62
  • 博客等级: 民兵
  • 技术积分: 442
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-30 11:45
文章分类

全部博文(168)

文章存档

2016年(2)

2015年(19)

2014年(98)

2013年(22)

2012年(6)

2011年(21)

分类: C/C++

2013-09-04 15:26:32

首先看下内核中这段代码:
 

<2.6.30-rc4:linux/kernel.h>
/* If you are writing a driver, please use dev_dbg instead */
#if defined(DEBUG)
#define pr_debug(fmt, ...) \
    printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__)
#elif defined(CONFIG_DYNAMIC_DEBUG)
/* dynamic_pr_debug() uses pr_fmt() internally so we don't need it here */
#define pr_debug(fmt, ...) do { \         《===1*
    dynamic_pr_debug(fmt, ##__VA_ARGS__); \
    } while (0)
#else
#define pr_debug(fmt, ...) \
    ({ if (0) printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__); 0; })《===2*
#endif

关于这段代码学习两个技巧:

1.do{ func1_call();func2_call(); }while(0);

好处:

  • #define do_nothing()  do {} while(0)

    这是个空操作,并且这样编译时不会出现警告。 

  • 1*中的{}可以组成一个代码块:{}中可以新建变量,实现复杂算法。

    由于使用宏就如同使用函数一般,必须在最后添加一个“;”,即像如下的方法使用:

    pr_debug(“error: write a file.”); 这样宏定义中只能用do{} while(0),而不能直接使用{}来构成一个代码块。     

2.({if (0) func_call(); 0; })

  • 直接改成({ 0; })可不可以。

    不可以。因为这样编译时会有警告:变量未使用。

  • “0;”语句是做什么用的呢。

   为了使这个代码段的返回值为0.

    注意:#define swap(a, b) {int tmp; tmp = b; b = a; a = tmp;}

     c=wap(a,b);是没有返回值的,c=0;

   而:#define swap(a, b) ({int tmp; tmp = b; b = a; a = tmp;})

    则c=wap(a,b);是有返回值的,就是{}中最后语句的值,c=a;

 

 

 

阅读(2547) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~