C語言學習應該注意的地方

來源:互聯網
上載者:User

剛才在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 * 類型的,不解,現在有點眉目了。嘿嘿。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.