Chinaunix首页 | 论坛 | 博客
  • 博客访问: 708390
  • 博文数量: 192
  • 博客积分: 2653
  • 博客等级: 少校
  • 技术积分: 1623
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-31 18:25
个人简介

How tough life is, how strong you should be!

文章分类

全部博文(192)

文章存档

2015年(1)

2014年(2)

2013年(37)

2012年(152)

分类: LINUX

2012-07-13 13:27:24

在看tty驱动时看到uart_register_driver函数时,看到BUG_ON(C),跟进去看到
#define BUG_ON(C) __BUG_ON((unsigned long)(C))    
不解,查资料如下:

BUG_ON()函数是一函数宏,系统最终调用的是__BUG_ON((unsigned long)(C))

函数:

__BUG_ON((unsigned long)(C))它的作用是判断n是否大于255,若大于255则出错。

此处的n表示在第n个表项中插入一个中断门(因为表项总共有255个,所以当n大于255时出错)。

 

 

突然发现BUG_ON(drv->state)中的state是结构体指针,虽然是上面的定义,但是用source insight还看到有其他定义,看到一个奇怪的do while(0),

#define BUG_ON(x) do {      \
 if (__builtin_constant_p(x)) {    \
  if (x)      \
   BUG();     \
 } else {      \
  __asm__ __volatile__(    \
  "1: "PPC_TLNEI" %4,0\n"   \
  _EMIT_BUG_ENTRY     \
  : : "i" (__FILE__), "i" (__LINE__), "i" (0), \
    "i" (sizeof(struct bug_entry)),  \
    "r" ((__force long)(x)));   \
 }       \
} while (0)

原来是为了宏定义的

(1)宏展开后有分号导致出现错误

(2) 因为没有{},而有判断语句导致宏第一行以外的全部执行

do…while(0)保证宏作为一个整体来是实现

 

哈哈,有学到一个小知识,貌似以前看c的时候书上有写过,不过印象不深刻呀,还是实际碰到查清印象深呀。

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