剛才在CU裡面看到一個關於宏的帖子,不解,隨查《linux內核情景分析》(其中的一小節),呵呵。
<1>
#define DUMP_WRITE(addr,nr)
do
{
memcpy(bufp,addr,nr);
buf += nr ;
} while(0)
如果如下
#define DUMP_WRITE(addr,nr)
memcpy(bufp,addr,nr);
buf += nr ;
或者 :
#define DUMP_WRITE(addr,nr)
{
memcpy(bufp,addr,nr);
buf += nr ;
}
在有的情況宏定義的時候可能會出錯。特別是if else 中容易出現語法錯誤。
<2> 為了提高數據結構的通用性,可以用宏對數據結構進行操作。
如 ;
#define INIT_LIST_HEAD (ptr)
do
{
(ptr)->next= (ptr);
(ptr)->pre= (ptr);
}while(0)
當然也可以使用inline 函數。
<3> 一個求結構體首地址的宏:
寫一個帶參數宏get_struct_addr_from_member_addr(p, stru, m),能夠根據任意結構實體的某一個成員的地址,算出該結構實體的地址,其中參數p是指向該成員的指針,stru是該結構體,m是該成員。
答案如下:
#define get_struct_addr_from_member_addr(p, stru, m)
( stru*)( (char*)p - (char*)&(((stru*)0)->m) )
主要是強制類型轉換,以前看信號的時候,有把0,1,2強制類型轉化成 struct * 類型的,不解,現在有點眉目了。嘿嘿。