程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C語言學習應該注意的地方

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

編輯:關於C語言

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved