亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 4480 | 回復: 11
打印 上一主題 下一主題

高手進來看一下,為什么kernel的這個macro要這樣寫,謝謝! [復制鏈接]

論壇徽章:
0
跳轉到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2008-03-13 16:09 |只看該作者 |倒序瀏覽
10可用積分
小弟在閱讀kernel的code時,發(fā)現有下面的macro的定義:

#define INIT_LIST_HEAD(ptr) do { \
        (ptr)->next = (ptr); (ptr)->prev = (ptr); \
} while (0)


讓我感覺到奇怪的是,為什么這里要定義成do-while結構?
為什么不直接定義成下面這個樣子呢?
#define INIT_LIST_HEAD(ptr) \
(ptr)->next = (ptr);\
(ptr)->prev = (ptr);


我認為我所定義的macro產生的code會更!

論壇徽章:
0
2 [報告]
發(fā)表于 2008-03-13 19:53 |只看該作者
這里的do {} while 只是起到大括號的作用:wink:
do while還有一些妙用,可以代替goto語句,樓主感興趣的話可以上網搜搜

論壇徽章:
0
3 [報告]
發(fā)表于 2008-03-14 16:14 |只看該作者
同意樓上的

想問一下 LZ的方法能通過編譯不?

論壇徽章:
0
4 [報告]
發(fā)表于 2008-03-20 13:47 |只看該作者
LZ的方法加上了一個分號后就會有問題。

INIT_LIST_HEAD(ptr);

一般內核里都是這么寫的,這個分號會有些麻煩的。

論壇徽章:
0
5 [報告]
發(fā)表于 2008-03-22 23:18 |只看該作者
我也對此處感到疑惑,自認為這個while(0)另有目的,內核中很多代碼都相當有技巧的。

論壇徽章:
0
6 [報告]
發(fā)表于 2008-03-22 23:55 |只看該作者
路過學習下!。~~~~

論壇徽章:
0
7 [報告]
發(fā)表于 2008-03-23 18:04 |只看該作者

回復 #5 dwen20 的帖子

有什么目的?不介意分享一下吧

論壇徽章:
0
8 [報告]
發(fā)表于 2008-04-29 15:30 |只看該作者
內核中有很多類似的現象,也一直很迷惑,重點關注中。。。

論壇徽章:
0
9 [報告]
發(fā)表于 2008-04-29 16:33 |只看該作者
請參考<Linux內核源代碼情景分析>第1章, 里面有詳細的講解, 講述了為什么這么做的原因.

論壇徽章:
0
10 [報告]
發(fā)表于 2008-05-01 15:14 |只看該作者
這是由于宏定義的一些缺陷導致的:)如果沒有do{ }while(0),那么在該預編譯階段宏定義被展開之后會出現問題(這里的展開就是替換)。舉個例子如下:
#define M_FUNC(a, b, c)   a=1; b=2; c=3;

在具體代碼中:
if (flag)
   M_FUNC(i,j,k)

else
   ...

用宏定義之后為:
if (flag)
    a=1;
    b=1;
    c=1;
else
   ...

這顯然是不對的,也不是我們期望的!

如果使用了do {}while(0)定義為:
#define M_FUNC(a,b,c)  do {a=1; b=2; c=3}while(0)

就可以避免上述這個錯誤,這是do {}while(0)的一個主要用途~
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術有限公司. 版權所有 京ICP備16024965號-6 北京市公安局海淀分局網監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯網協會會員  聯系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉載本站內容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP