How tough life is, how strong you should be!
分类: LINUX
2012-07-13 13:27:24
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的时候书上有写过,不过印象不深刻呀,还是实际碰到查清印象深呀。